![](/img/trans.png)
[英]Freeing memory by using free() whoes pointer is inside a pointer pointing to structure
[英]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.