我用C语言编写了以下代码:
#include <stdio.h>
#include <stdlib.h>
int main (int argc , char *argv[]) {
int * ptr = (int *)malloc(sizeof(int));
int three = 3;
ptr = &three;
free(ptr);
return EXIT_SUCCESS;
}
执行时,出现以下错误:
Abort signal from abort(3) (SIGABRT).
您能帮我发现我的错误吗? 谢谢!
答案 0 :(得分:3)
您所拥有的是未定义的行为。因此,C11标准规定:
7.22.3.3免费功能
...
2 free函数使ptr指向的空间被释放,即 可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果 该参数与内存管理器先前返回的指针不匹配 函数,或者如果通过调用释放或重新分配空间已释放空间,则 行为是不确定的。
在您的示例中,free
的参数为&three
,它不是内存管理函数返回的指针,因此您具有所看到的行为。
答案 1 :(得分:1)
调用malloc
时,将返回指向请求大小的内存块的指针(成功时)。此内存块是从堆中分配的,您可以在以后调用free
时使用该指针取消分配。
局部变量是从堆栈分配的内存。
您在这里所做的是从堆分配内存块:
int * ptr = (int *)malloc(sizeof(int));
然后覆盖,然后用内存驻留在堆栈中的局部变量的地址覆盖ptr
。
ptr = &three;
,然后尝试释放该内存:
free(ptr);
这是不确定的行为。