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

C Free导致错误:Free():无效指针:0x0000000001d04018,c,pointers,C,Pointers,我试图编译以下代码: #include <stdio.h> void main() { int *p = (int*) malloc(4*sizeof(int)); p++; p++; free(p); } 但它给了我以下的错误 *“/home/a.out”中出错:空闲:无效指针:0x0000000001d04018* 流产了 我想我仍然在分配的大小限制4整数之内。但为什么指针无效呢。有人能帮忙吗。malloc和free的合同相当简单。传递给fre

我试图编译以下代码:

#include <stdio.h>

void main()
{
    int *p = (int*) malloc(4*sizeof(int));
    p++;
    p++;
    free(p);
}
但它给了我以下的错误

*“/home/a.out”中出错:空闲:无效指针:0x0000000001d04018* 流产了

我想我仍然在分配的大小限制4整数之内。但为什么指针无效呢。有人能帮忙吗。

malloc和free的合同相当简单。传递给free的地址的指针值必须正好是从malloc获得的指针值


完全正确,而且不在同一块,无论多么接近。它必须完全匹配。在将指针传回增量之前修改指针,因此违反了该约定。这将导致未定义的行为。你会在一次车祸中体验到这一点。更糟糕的是,它可能会起作用。直到它在你脸上爆炸以后没有明显的原因。这就是未定义行为的本质。避免它

您正在调用未定义的行为

发件人:

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

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

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

释放函数只能对已直接分配给malloc或其任何伙伴的指针进行操作

如果更改指针,将出现如下错误,修改后的指针从未分配

足够近并不重要。它必须与您首先得到的指针相同。

您只能在malloc返回的指针上调用free。