在一些迭代C之后Realloc腐败

时间:2017-02-13 18:47:46

标签: c pointers malloc realloc memory-corruption

我试图在函数中为一个struct指针数组动态分配内存。它一直工作到3次迭代,但在出现此错误后崩溃:

double free or corruption (fasttop): ...

这是我的struct指针数组声明:

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然后我得到了错误。

有人知道它为什么会起作用然后突然崩溃吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

答案 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;
}