无法找到此代码的错误,它在输入正好4个值时按预期工作,但在第五次调用时(在它甚至要求scanf之前)它总是给我这个错误: * glibc检测到 ./a2:双重免费或损坏(fasttop):0x0916e018 * *
以下是我的程序的一些代码:
typedef struct {
int i;
char str[25];
} typeX;
int main(){
int dSize = 0;
int *dSizePtr = &dSize;
dPointer = (typeX **)malloc(sizeof(typeX *)); // makes an array of pointers
int i;
for (i = 0; i < 100; i++)
makeElement(dPointer, dSizePtr); // Puts values into those pointers
free(dPointer);
return 0;
}
void makeElement(dPointer **, int *dSizePtr){
dPointer = (typeX **)realloc(dPointer, sizeof(typeX *)*(*dSizePtr+1)); // grow the array by one
if (typeX == NULL)
return; // some kind of quit statement, just return for now
dPointer[*dSizePtr] = (typeX *)malloc(sizeof(typeX)); // make a new pointer in the array
scanf("%s", dPointer[*dSizePtr]->str); // input the values of the struct (have to use scanf)
char input[20];
scanf("%s", input);
dPointer[*dSizePtr]->int = atoi(input);
++(*dSizePtr);
}
我知道我没有制作dSizePtr而且我可以直接传入&amp; dSize,但我的程序当前设置的方式(这不完全相同,只是为了可读性而压缩),这就是我必须通过它。
老实说,我不知道为什么会出现这个错误。一直在看我的代码几个小时并在线阅读并没有找到解决方案。任何帮助将不胜感激!
答案 0 :(得分:1)
问题是,您的函数makeElement
获取dPointer
的值,而不是其引用。当您realloc
数据时,将释放最初分配的块。但是makeElement
范围之外的dPointer没有改变;
运行时错误被延迟,因为实际内存分配的执行量大于sizeof(typeX *)
答案 1 :(得分:0)
此行导致双重免费。
dPointer = (typeX **)realloc(dPointer, sizeof(typeX *)*(*dSizePtr+1)); // grow the array by one
对于调用者中循环的前几次迭代,内存块足够大,以至于realloc()不必执行任何操作,因此它返回传递给它的相同指针。但是在某些时候内存块太小了,realloc()必须分配一个新的内存块并返回一个指向它的指针。返回的指针在makeElement()中分配给dPointer,但它不会更改调用者中的dPointer值。所以调用者继续将旧的dPointer值传递给makeElement(),它将它传递给realloc(),它注意到该指针已被释放(通过调用扩展数组大小的realloc())。 p>