我昨天写了下面的插入排序(我3天前开始学习C)出于某种原因,排序根本不会修改数组。

#include <stdio.h>
int *insert(int arr[], int index, int item);
int *isort(int arr[]);
int main() {
    int a[17] = {1, 2, 9, 5, 3, 2, 1, 6, 5, 9, 0, 1, 3, 4, 2, 3, 4};
    int *b = isort(a);
    for (int i = 0; i < 17; i += 1) {
        printf("%d ", b[i]);
    }
    return 0;
}
int *insert(int arr[], int index, int item) {
    --index;
    while (index >= 0 && item < arr[index]) {
        arr[index + 1] = arr[index];
        --index;
    }
    arr[index + 1] = item;
    return arr;
}
int *isort(int arr[]) {
    for (int i = 1; i < sizeof(arr) - 1; i++) {
        arr = insert(arr, i, arr[i]);
    }
    return arr;
}

我想它可能是我的编译器,因为我正在运行一个非unix机器上的编译器:lcc win,但我不确定有什么我遗漏了的基本的东西吗?

最佳答案

int *isort(int arr[]) {
    for (int i = 1; i < sizeof(arr) - 1; i++) {
        arr = insert(arr, i, arr[i]);
    }
    return arr;
}

在这个函数中sizeof(arr)实际上返回指针的大小,而不是数组的大小。
在C语言中,一条特殊的规则是数组参数实际上被调整为对应指针类型的参数。
即:
int *isort(int arr[]) { /* ... */ }

相当于:
int *isort(int *arr) { /* ... */ }

要解决此问题,请在函数中添加一个新参数,该参数采用数组的大小:
int *isort(int arr[], size_t size) { /* ... */ }

08-18 10:10
查看更多