C - 被释放的指针未被分配

时间:2016-04-15 14:16:50

标签: c memory free

我正在尝试释放我从分配了malloc()的向量中分配的指针,当我尝试删除第一个元素(index [0])时,它可以工作,当我尝试删除第二个时( index [1])我收到此错误:

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

代码:

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

3 个答案:

答案 0 :(得分:11)

您只能对free()和家人返回的指针调用(或需要)malloc()

引用C11,章节§7.22.3.3

  

[...]否则,如果   该参数与先前由内存管理返回的指针不匹配   函数,或者如果通过调用freerealloc释放了空格,则   行为未定义。

在您的情况下,table->t(或&table->t[0])是指针,而不是&table->t[1]

也就是说,free() - ing table->t释放整个内存块,你不需要(你不能,而不是)单独/部分释放。有关详细信息,请参阅this answer

答案 1 :(得分:3)

它适用于第一个元素,因为& table-> t [0] 等于 table-> t 。那是因为第一个元素与数组本身具有相同的地址(根据数组的定义)。 并且由于数组本身具有已分配的地址,因此只能释放该地址。

答案 2 :(得分:1)

malloc()通过分配单个连续内存区域来工作,其可用大小是由它传递的单个整数参数。它返回分配区域的指针。

您只能将返回的指针释放一次,而不是它的子集。

数组中的数组不是对象,它们是指针算术的合成糖,这可能是C编程的主要问题,如果你致力于学习C,你应该仔细研究这个领域