簡體   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