C-realloc():无效的指针错误被枚举

时间:2018-07-21 12:31:13

标签: c

我一直在尝试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};

欢呼

2 个答案:

答案 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给出的示例。

尝试用铅笔和纸来做到这一点,您就会明白我的意思。