C - 未分配被释放的指针

C - pointer being freed was not allocated

我试图释放一个指针,该指针是我从分配给 malloc() 的向量中分配的,当我尝试删除第一个元素(索引 [0])时,它起作用了,当我尝试删除second(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);

您只能在 malloc() 和 family 返回的指针上调用(或需要)free()

引用 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 释放了 whole 内存块,你不需要(你不能,而是)单独/部分免费。有关详细信息,请参阅 this answer

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

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

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

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