繁体   English   中英

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

[英]Double pointer memory allocation to a struct in C

找不到此代码出了什么问题,在输入正好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,我可以只传递&dSize,但是当前程序的设置方式(这并不完全相同,只是为了便于阅读而进行压缩),这就是我必须通过的方式它。

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

问题是,你的函数makeElement得到的值dPointer ,而不是它的参考。 当你realloc数据,原先分配的块被释放。 但是makeElement范围之外的makeElement不会更改;

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

这条线导致双重释放。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM