我一直在尝试O(n ^ 2)排序算法只是为了练习C,但是遇到了这个令人讨厌的“ realloc():无效指针”错误,无法弄清原因。我查看了其他解释,但是它们并没有太大帮助。
#include <stdio.h>
#include <stdlib.h>
int* removeIndex(int* list, int index, int len){
for(int i = index; i < len - 1; i++){
list[i] = list[i+1];
}
return realloc(list, len - 1);
}
int* sort(int* unsorted, int len){
int* sorted = malloc(len * sizeof(int));
for(int placement = 0; placement < len; placement++){
int smallest_index = 0;
int smallest = unsorted[smallest_index];
int len_unsorted = len - placement;
for(int i = 0; i < len_unsorted; i++){
if (unsorted[i] < smallest){
smallest = unsorted[i];
smallest_index = i;
}
}
unsorted = removeIndex(unsorted, smallest_index, len_unsorted);
sorted[placement] = smallest;
}
return sorted;
}
int main()
{
int len = 5;
int unsorted[5] = {5,4,3,2,1};
int* sorted = sort(unsorted, len);
for(int i = 0; i < len; i++){
printf("%d\n", sorted[i]);
}
return 0;
}
在旁注中,为什么我写的时候会出错
int len = 5;
int unsorted[len] = {5,4,3,2,1};
所以我必须强行将其写为int unsorted[5] = {5,4,3,2,1};
欢呼
答案 0 :(得分:3)
传递给realloc
的指针指向具有自动存储持续时间的数组,该数组在main()
中声明和初始化,而不指向先前分配有malloc
的存储块,{ {1}}或calloc
。
来自realloc, [已添加重点]
重新分配给定的内存区域。 它必须事先由malloc(),calloc()或realloc()分配,并且尚未通过调用free或realloc进行释放。否则,结果是不确定的。
答案 1 :(得分:0)
除了H.S.的答案外,我认为排序算法的设计不当。对该函数removeIndex
的第一次调用是通过这样的参数完成的:
removeIndex(unsorted, 4, 5)
未输入for循环,并且应该使用realloc(list, 4)
进行重新分配。
据我所知,排序算法通常无法正常工作。特别是您以5,4,3,2,1给出的示例。
尝试用铅笔和纸来做到这一点,您就会明白我的意思。