一些迭代后重新分配损坏 C
Realloc corruption after some iteration C
我正在尝试为函数中的结构指针数组动态分配内存。它一直工作到 3 次迭代,但在出现此错误后崩溃:
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 然后我收到错误。
有人知道为什么它能正常工作然后突然崩溃吗?
感谢您的帮助。
您更改 checkFunction
中 alreadyUse
的值。但这对调用者没有影响。如果对 realloc
的调用实际上重新分配,调用者仍然有一个指向现在已被释放的旧块的指针。
在这个函数调用中
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;
}
我正在尝试为函数中的结构指针数组动态分配内存。它一直工作到 3 次迭代,但在出现此错误后崩溃:
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 然后我收到错误。
有人知道为什么它能正常工作然后突然崩溃吗?
感谢您的帮助。
您更改 checkFunction
中 alreadyUse
的值。但这对调用者没有影响。如果对 realloc
的调用实际上重新分配,调用者仍然有一个指向现在已被释放的旧块的指针。
在这个函数调用中
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;
}