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,你应该仔细研究这个领域。
我试图释放一个指针,该指针是我从分配给 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
orrealloc
, 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,你应该仔细研究这个领域。