我尝试编译以下代码:
#include <stdio.h>
void main()
{
int *p = (int*) malloc(4*sizeof(int));
p++;
p++;
free(p);
}
但是它给了我以下错误。
*`/home/a.out' ;:中的错误:free():指针无效:0x0000000001d04018 *
中止。
我认为我仍然在4大小的分配限制范围内。但那么为什么无效指针。可以帮助一些人。
答案 0 :(得分:4)
您正在调用未定义的行为。
来自free manual:
free()函数释放ptr指向的内存空间,必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。
您是否在分配区域内并不重要。指针必须与之前分配的指针相同。
未定义的基本原理是典型的实现(这是实现定义的)必须记住与分配相关的其他元数据,例如:分配大小,在某些数据结构中,以便以后释放它们。如果ptr
与分配函数返回的不相同,那么在释放期间无法查找此数据结构以获取这些元数据。
答案 1 :(得分:2)
free()
函数只能对直接分配了malloc()
或其任何同伴的指针进行操作。
如果更改指针,则会出现这样的错误,那么修改后的指针从未被分配过。
&#34;足够接近&#34;不算数。它必须与您首先获得的指针相同。
答案 2 :(得分:1)
malloc
和free
的合同相当简单。传递给free
的指针值(地址)必须完全您从malloc
获得的指针值。
完全,而不是在同一个街区,无论多么接近。它必须完全匹配。您在将指针传回之前修改指针(您递增),因此您违反了该合同。这将导致未定义的行为。而且你会在崩溃中体验它。可能更糟糕的是,它似乎可行。直到它在你的脸上爆炸,没有明显的原因。这是未定义行为的本质。躲开它。