2017-02-13 102 views
1

我想动态地分配内存中的函数结构指针的数组。它的工作原理,直到3次迭代,但坠毁与此错误后:一些迭代后Realloc腐败C

double free or corruption (fasttop): ... 

这里是我的结构指针数组声明:

Intersection** alreadyUse = malloc(sizeof(Intersection*)); 

if(alreadyUse == NULL) { 
    exit(1); 
} 

int size = 1; 
alreadyUse[0] = inter; // Pointer of an Intersection 

// Some Code 

checkFunction(alreadyUse, &size, interLeft); 

这是我的功能

bool checkFunction(Intersection** alreadyUse, int* size, Intersection* inter) { 

    for(int i = 0; i < *size; i++) { 
     if(alreadyUse[i] == inter) { 
      return true; 
     } 
    } 

    *size = *size +1; 
    Intersection** tmp = realloc(alreadyUse, sizeof(Intersection*) * *size); 

    if(tmp == NULL){ 
     exit(1); 
    } 
    else { 
     alreadyUse = tmp; 
    } 

    alreadyUse[*size-1] = inter; 

    return false; 
} 

正如我所说的,它适用于1,2,3,然后我得到错误。

有人有一个想法,为什么它的作品,然后突然崩溃?

感谢您的帮助。

+1

我们不知道交集类型 –

回答

1

在该函数调用

checkFunction(alreadyUse, &size, interLeft); 

可变size通过引用传递。所以可以在函数中改变它。但是,如您所见,变量alreadyUse未通过引用传递。所以函数处理变量值的副本。如果你想要的变量将在函数被改变,你必须按引用传递它

checkFunction(&alreadyUse, &size, interLeft); 
       ^^^^^^^^^^^ 

这样的函数应该声明如下

bool checkFunction(Intersection*** alreadyUse, int* size, Intersection* inter); 
        ^^^^^^^^^^^^^^^ 

函数定义可以像

bool checkFunction(Intersection ***alreadyUse, int *size, Intersection *inter) 
{ 
    for (int i = 0; i < *size; i++) 
    { 
     if (alreadyUse[0][i] == inter) return true; 
    } 

    Intersection **tmp = realloc(alreadyUse[0], sizeof(Intersection *) * (*size + 1)); 

    if (tmp == NULL) exit(1); 

    alreadyUse[0] = tmp; 

    alreadyUse[0][(*size)++] = inter; 

    return false; 
} 
+0

由于C是一种纯粹按值语言传递,所以“通过引用”传递“size”是混淆且不准确的。指向'size'的指针是按值传递的。 –

+1

@DavidSchwartz引用的术语在C语言中是有效和准确的。例如“一个指针类型描述了一个对象,它的值提供了对引用类型实体的引用”。 –

+0

也许:“...参考大小”通过...“ – chux

4

您更改checkFunctionalreadyUse的值。但是这对调用者没有影响。如果realloc的调用实际上重新分配,调用者仍然有一个指向现在已被释放的旧块的指针。