我昨天写了下面的插入排序(我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) { /* ... */ }