2016-04-15 83 views
0

我試圖釋放一個指針,當我嘗試刪除第一個元素(索引[0])時,它被分配的矢量與malloc()一起分配,刪除第二個(指數[1]),我收到此錯誤:被釋放的C指針沒有被分配

malloc: *** error for object 0x100200218: pointer being freed was not allocated 

代碼:

table->t = malloc (sizeof (entry) * tam); 
entry * elem = &table->t[1]; 
free(elem); 

回答

11

只能致電(或需要)free()malloc()和家人返回的指針。

引用C11,章§7.22.3.3

[...] Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

在你的情況,table->t(或&table->t[0])是指針,而不是&table->t[1]

這就是說,free() -ing table->t釋放的整個內存塊,你不需要(你不能,而)自由獨立/部分。有關更多信息,請參閱this answer

+2

你應該仔細研究也許添加釋放'&table-> t [0]'只能工作,因爲它相當於'table-> t'。 – Siguza

3

它工作在第一元件上,因爲&表 - > T [0]等於表 - >噸。這是因爲第一個元素與數組本身具有相同的地址(根據數組的定義)。 由於數組本身具有已分配的地址,因此只能釋放該地址。

1

malloc()通過分配一個連續的內存區域來工作,其可用大小是它傳遞的單個整數參數。它爲分配的區域返回一個指針。

你只能釋放返回的指針一次,而不是它的一個子集。

數組不是在C的對象,他們是語法糖,以指針運算,這可能是C語言編程和地區的主要頭痛,如果你致力於學習C.

相關問題