2016-09-20 76 views
-4

上的内存损坏(快)错误所以我一直在使用合并排序方法,它使用泛型类型作为输入并对它们进行排序。我收到一个我不明白的错误。因为我使用泛型类型并需要对20 kk记录进行排序,所以我必须使用malloc函数来分配用于实现合并排序的数组,因此需要在不需要时立即释放它们以避免填满我所有的记忆。下面是代码(我只会把相关代码段):C,免费()

代码

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 *** 

如果有人能帮助我,我会深深appreaciate它。

+0

闻起来像一个错误。 –

+1

请显示[MCVE]。 –

+0

for A [1]必须运行到n1 –

回答

1
A1 = malloc(sizeof(sizeof(void*))*n1); 

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

+3

sizeof returns size_t – stark

+0

@monkeyStix你的报价说“整数常量”,而不是“int”。 –

+0

谢谢,就是这样。其实我不知道为什么我会这么做,我只需要sizeof(void *)* n1。再次感谢你:) – SkullMonkey

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

+0

谢谢你的考虑,但它似乎是其他问题:) – SkullMonkey