C,free()上的内存损坏(快速)错误

时间:2016-09-20 18:36:16

标签: c memory malloc free

所以我一直在研究一种合并排序方法,它使用泛型类型作为输入并对它们进行排序。我收到一个我不明白的错误。因为我使用泛型类型并且需要对20 kk记录进行排序,所以我必须使用malloc函数来动态分配我用来实现合并排序的数组,因此需要在不再需要它们时立即释放它们以避免填满我的全部记忆。这是代码(我只会提供相关的代码):

代码

void merge(void ** A, int a, void ** B, int b, void ** C , CompFunction compare)
{

    int i,j,k;
    i=0;
    j=0;
    k=0;
    while(i < a && j < b){
        if((compare(A[i],B[j])<0)){
            C[k++] = A[i++];
        }
        else{
            C[k++] = B[j++];

        }

    }
    while(i < a){
        C[k++] = A[i++];
    }
    while(j < b){
        C[k++] = B[j++];
    }


}
  void merge_sort(void** A, int n, CompFunction compare)
{
int i;
    void ** A1;
    void ** A2;
    int n1,n2;
    if(n < 2)return;
    n1 = n/2;
    n2 = n - n1;
    A1 = malloc(sizeof(sizeof(void*))*n1);
    A2 = malloc(sizeof(sizeof(void*))*n2);
    printf("i:%d\n",i);
    for(i = 0 ; i < n2 ; i++){
        A1[i] = A[i];
    }
    for(i = 0 ; i < n2 ; i++){
        A2[i] = A[i+n1];
    }       
    merge_sort(A1, n1, compare);
    merge_sort(A2 ,n2, compare);
    merge(A1, n1, A2, n2, A, compare);
    free(A1);
    free(A2);
}

你会看到我在函数参数中调用了一个比较函数。这只是一个功能,可以比较各种类型的数据,以确定哪一个更大或更小。 我试图删除free()和错误不再显示,但代码永远不会结束运行,因为它填满了硬盘上的所有内存和交换区域。 我得到的错误是:

错误

*** Error in `./exeInt': malloc(): memory corruption       
(fast):0x00000000006dffa0 ***

如果有人可以帮助我,我会非常感激。

2 个答案:

答案 0 :(得分:1)

$result = (int)$length * (int)$width * (int)$height;  
print $result;

这是你的问题,让我们首先评估一下sizeof(void *),即8字节(在64位系统中)。然后你把它乘以n1这是一个int,这导致结果计算为一个int,因此你得到4个字节* n1而不是像我想要的那样得到8个字节。

答案 1 :(得分:0)

我不认为这是问题,但至少有一个问题是:

for(i = 0 ; i < n2 ; i++){
   A1[i] = A[i];
}
for(i = 0 ; i < n2 ; i++){
    A2[i] = A[i+n1];
}   

第一个for循环应为(...; i < n1;...)。可能是你正在溢出阵列。

此外,正如其他人所提到的,您并未检查malloc的返回值,但这不是问题。请注意,malloc将在失败时返回NULL