0

找不到此代码有什么问题,它在输入正好 4 个值时按预期工作,但在第五次调用时(甚至在它要求 scanf 之前)它总是给我这个错误: * glibc detected./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,我可以传入 &dSize,但是我的程序当前设置的方式(这不完全相同,只是为了可读性而压缩),这就是我必须通过的方式它。

老实说,我不知道为什么会出现这个错误。一直在查看我的代码几个小时并在线阅读并没有找到解决方案。任何帮助将不胜感激!

4

2 回答 2

1

问题是你的函数makeElement得到的值dPointer,而不是它的引用。当你realloc数据时,最初分配的块被释放。但是范围之外的 dPointermakeElement没有改变;

运行时错误被延迟,因为实际内存分配的数量大于 sizeof(typeX*)

于 2012-10-21T19:47:40.440 回答
0

这条线导致双重释放。

dPointer = (typeX **)realloc(dPointer, sizeof(typeX *)*(*dSizePtr+1)); // grow the array by one

对于调用者中循环的前几次迭代,内存块足够大,realloc() 不必做任何事情,因此它返回传递给它的相同指针。但是在某些时候内存块太小了,realloc() 必须分配一个新的内存块并返回一个指向它的指针。该返回的指针在 makeElement() 中分配给 dPointer,但它不会更改 caller 中 dPointer 的值。因此,调用者继续将旧的 dPointer 值传递给 makeElement(),后者将其传递给 realloc(),后者注意到该指针已被释放(通过调用 realloc() 扩展了数组的大小)。

于 2012-10-21T20:05:20.633 回答