2016-04-15 85 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.

相关问题