我正在尝试释放我从分配了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);
答案 0 :(得分:11)
您只能对free()
和家人返回的指针调用(或需要)malloc()
。
引用C11
,章节§7.22.3.3
[...]否则,如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果通过调用
free
或realloc
释放了空格,则 行为未定义。
在您的情况下,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,你应该仔细研究这个领域