【问题标题】:C, memory corruption(fast) error on free()C、free() 上的内存损坏(快速)错误
【发布时间】:2017-01-28 19:26:18
【问题描述】:

所以我一直在研究一种使用泛型类型作为输入并对它们进行排序的合并排序方法。我收到一个我不明白的错误。因为我使用泛型类型并且需要对 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 ***

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

【问题讨论】:

  • 闻起来像一个错误。
  • for A[1] 必须运行到 n1
  • 你没有检查 malloc 的结果。
  • 什么是“20 kk”?为什么不使用可变长度数组(VLA)?如果您追求速度,malloc 和朋友是我最后一次使用的。

标签: c memory malloc free


【解决方案1】:

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

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

第一个 for 循环应该是 (...; i &lt; n1;...)。可能是你溢出了数组。

另外,正如其他人所提到的,您没有检查malloc 的返回值,尽管这不是问题。请注意,malloc 将在失败时返回 NULL

【讨论】:

  • 感谢您的考虑,但问题似乎出在其他地方 :)
【解决方案2】:
A1 = malloc(sizeof(sizeof(void*))*n1);

这是你的问题,让我们评估第一个 sizeof(void *),即 8 字节(在 64 位系统中)。然后你将它乘以 n1,它是一个 int,这会导致结果评估为一个 int,因此你得到 4 个字节 * n1 而不是我假设你想要的 8 个字节。

【讨论】:

  • sizeof 返回 size_t
  • @monkeyStix 你的报价是“整数常量”,而不是int
  • 谢谢,就是这样。实际上我真的不知道我为什么要这么做,我只需要一个 sizeof(void*)*n1。再次感谢你:)
  • 你是对的人,它确实评估为 size_t,刚刚检查过。虽然它确实评估为 int 如果它解决了问题
  • @monkeyStix:请提供参考,其中 C11 标准规定 sizeof 返回 int。它返回一个size_t!并且指针的大小必须为 8 个字节(或您假设的其他值)。还要仔细检查括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
相关资源
最近更新 更多