結構

2014-03-26 21 views
-3

的指針內釋放內存我有這樣的結構結構

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

+2

我假設你想分配20個矩形的內存;該代碼將是'shp.rectangle =(RCG *)malloc(sizeof(RCG)* 20)'。您的原始代碼保留20個_pointers_的空間('type *'是指向類型的指針)。 –

回答

2

當您使用以下行

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

您正在將指針設置爲與原始返回值不同的位置。

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

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

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

更新:如以下注釋中所述,由於我們在此特定情況下處理字符串,因此使用函數strncpy而不是更通用的memcpy可能更合適。

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

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

+1

爲什麼不使用str(n)cpy? –

+0

@PeterSchneider,在這種情況下,你可能是對的,但我展示的是'memcpy',因爲我想強調**內存**正在被複制,而且OP的問題比字符串更普遍。 – merlin2011

0

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

memcpy甚至更好strcpy通常用於複製字符串;那些將在名字中分配給每個字符的「大」對應的值。