Free导致错误:free():无效指针:0x0000000001d04018

时间:2018-04-30 05:45:16

标签: c pointers

我尝试编译以下代码:

#include <stdio.h>

void main()
{
    int *p = (int*) malloc(4*sizeof(int));
    p++;
    p++;
    free(p);
}

但是它给了我以下错误。

*`/home/a.out' ;:中的错误:free():指针无效:0x0000000001d04018 *
中止。

我认为我仍然在4大小的分配限制范围内。但那么为什么无效指针。可以帮助一些人。

3 个答案:

答案 0 :(得分:4)

您正在调用未定义的行为。

来自free manual

  

free()函数释放ptr指向的内存空间,必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。

您是否在分配区域内并不重要。指针必须与之前分配的指针相同。

未定义的基本原理是典型的实现(这是实现定义的)必须记住与分配相关的其他元数据,例如:分配大小,在某些数据结构中,以便以后释放它们。如果ptr与分配函数返回的不相同,那么在释放期间无法查找此数据结构以获取这些元数据。

答案 1 :(得分:2)

free()函数只能对直接分配了malloc()或其任何同伴的指针进行操作。

如果更改指针,则会出现这样的错误,那么修改后的指针从未被分配过。

&#34;足够接近&#34;不算数。它必须与您首先获得的指针相同。

答案 2 :(得分:1)

mallocfree的合同相当简单。传递给free的指针值(地址)必须完全您从malloc获得的指针值。

完全,而不是在同一个街区,无论多么接近。它必须完全匹配。您在将指针传回之前修改指针(您递增),因此您违反了该合同。这将导致未定义的行为。而且你会在崩溃中体验它。可能更糟糕的是,它似乎可行。直到它在你的脸上爆炸,没有明显的原因。这是未定义行为的本质。躲开它。