使用 malloc 的 C 错误:malloc.c:2451:sYSMALLOc "Assertion Failed"



我是 C 语言的初学者,遇到了内存分配问题。我检查了相关的讨论。我可能应该使用Valgrind,但是直到我学会如何使用它时,我才在这里发布问题。

这是我制作的合并排序代码的链接。http://ideone.com/utEzoq

但是,主要问题似乎在以下部分:

void main()
{
     MergeSort(list, 0, n-1) //calling function on pointer to array of integers
}
int *MergeSort(int *A, int x, int y) //declaration
{
if(x==y)
{
    return A;
}
else
{
    int size=1+y-x;
    int half=(x+y)/2;
    MergeSort(A, x, half);  
    MergeSort(A, half+1, y);    

    int *C;
    C=(int *)malloc(size*sizeof(int));
    int j=x;
    int k=half;
    int i=0;

    while((j<=half)||(k<=y))            
    {
        if(A[j]<=A[k])
        {
            C[i]=A[j];
            j++;
        }
        else
        {
            C[i]=A[k];
            k++;
        }
        i++;
    }

    if(j==(half+1))
    {
        while(i<size)
        {
            C[i]=A[k];
            i++;
            k++;
        }
    }
    else if(k==(y+1))
    {
        while(i<size)
        {
            C[i]=A[j];
            i++;
            j++;
        }
    }
    return C;
}

但是,不同类型的输入会出现错误。当我输入反向排序和排序数组时,它按输入顺序返回输出。随机数给出 malloc"断言失败"错误。

帮助将不胜感激。

你的问题

void main()

int main()

int k=half;

int k=half+1;

while((j<=half)||(k<=y)) 

while((j<=half)&&(k<=y))

return C;

for(i=0;i<size;++i){
    A[x+i]=C[i];
}
free(C);
return A;

在第一个while循环中写入超出数组长度的C元素,从而可能损坏mallocfree内部使用的信息。

整个实现有错误。例如,以递归方式调用排序函数,并在每次调用时分配辅助内存。您返回分配的缓冲区,但从不对其进行任何操作,更不用说free它了。排序函数不会排序,因为排序的数据(据说)在 C 中,您忽略了。您可以有效地打印出A .

编辑:没有必要学习瓦尔格林德。安装它,用-g编译你的程序,然后用Valgrind运行你的程序。除了输出之外,您还会收到错误和警告消息,清楚地说明发生内存冲突的位置。立即安装 Valgrind 并养成使用它的习惯 - 它将在未来节省您的时间。

相关内容

  • 没有找到相关文章