【问题标题】:Error in C using malloc: malloc.c:2451:sYSMALLOc "Assertion Failed"使用 malloc 的 C 语言中的错误:malloc.c:2451:sSYSMALLOc "Assertion Failed"
【发布时间】:2014-02-21 19:38:31
【问题描述】:

我是 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“断言失败”错误。

我们将不胜感激。

【问题讨论】:

    标签: c pointers malloc


    【解决方案1】:

    你的问题

    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;
    

    【讨论】:

    • 为什么我需要做 main int?我没有在 main 中返回任何内容。
    • 问题是,当我在两半上调用 MergeSort 时,我没有将排序后的半存储在任何地方。如果我创建 2 个单独的数组并将它们合并,那不会就地调用吗?我将如何实现就地排序?
    • 我做了 A=MergeSort(A, x, half); A=MergeSort(A, half+1, y);我仍然收到错误消息。例如,输入 1 2 给我 1 1; 4 3 2 1 给我 4 4 4 2。
    【解决方案2】:

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

    整个实现有错误。例如,您递归调用排序函数并在每次调用时分配辅助内存。您返回分配的缓冲区,但永远不会对它做任何事情,更不用说free 它了。排序函数不排序,因为排序后的数据(假设)在C 中,您忽略了它。你有效地打印出A

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

    【讨论】:

    • 我在调用用排序数组替换未排序数组时做了 list=MergeSort(list, 0, n-1) 。是的,我还没用过free。哦,好的,那我试试。在我尽我所能之后会在这里更新。谢谢!
    • 临时数组C只是为了让合并更容易。在函数的最后,使用 for 循环将 C 复制到 A 中的适当范围并释放 C。您的索引错误发生是因为您的条件逻辑错误,请尝试 (j&lt;=half &amp;&amp; k&lt;=y) 而不是 || 作为 while 循环的条件;您处理半数组中未在接下来的两个循环中合并的尾随条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2012-01-19
    • 2015-04-23
    相关资源
    最近更新 更多