簡體   English   中英

釋放結構指針內的內存

[英]freeing memory inside the pointer of structure

我有這個結構

typedef struct Rectangle{
  char *name;
  int size;
}RCG;

typedef struct Shapes{
   RCG *rectangle;
}SHP;

這是我的問題,我用 20 動態分配了 RCG ;

 SHP shp;
 shp.rectangle = (RCG*)malloc(sizeof(RCG *) * 20)

還為指針內的矩形名稱分配了內存;

shp.rectangle[0].name = malloc(10*sizeof(char));
shp.rectangle[0].name = "big";

我怎樣才能釋放名字? 我所做的是

free(shp.rectangle[0].name);

它給了我一個“堆可能已損壞”的錯誤

我使用 Visual Studio 2010

當您使用以下行時

shp.rectangle[0].name = "big";

您將指針設置為與malloc的原始返回值不同的位置。

您可能想要的是以下內容。

memcpy(shp.rectangle[0].name, "big", strlen("big") + 1)

此外,指針是否在結構內也無關緊要。 即使指針未在結構內定義,您也會遇到同樣的問題。

更新:正如在下面的評論中提到的,由於我們在這種特殊情況下處理字符串,因此使用函數strncpy而不是更通用的memcpy可能更合適。

strncpy(shp.rectangle[0].name, "big", 10*sizeof(char))

請注意,上面的10*sizeof(char)是硬編碼的,因為這是早期malloc的大小。

這: shp.rectangle[0].name = "big"; 不會將字符復制到分配的空間中,而是將字符串“big”的地址分配給指針名稱。 分配的內存不再在任何地方被引用,因此您失去了釋放它的任何方式。 相反,您嘗試釋放實際上是可執行文件一部分的字符串“big”。

memcpy 甚至更好的 strcpy 通常用於復制字符串; 這些將為名稱中的每個字符分配“大”中的相應值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM