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

我试图释放我从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); 

你只能对malloc()和family返回的指针调用(或需要) free()

引用C11 ,章节§7.22.3.3

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

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

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

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

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

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

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