双指针内存分配给C中的结构

时间:2012-10-21 19:44:02

标签: c pointers struct dynamic-memory-allocation double-pointer

无法找到此代码的错误,它在输入正好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,但我的程序当前设置的方式(这不完全相同,只是为了可读性而压缩),这就是我必须通过它。

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

2 个答案:

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