我用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).你能帮我找出我的错误吗?谢谢!
发布于 2019-02-22 17:46:12
你所拥有的是未定义的行为。C11标准如下所述:
7.22.3.3自由函数
..。
2 free函数使ptr指向的空间被释放,即可用于进一步的分配。如果ptr为空指针,则不会发生任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果空间已通过调用或realloc释放,则为。
在您的示例中,free的参数是&three,它不是内存管理函数返回的指针,因此您会看到这样的行为。
发布于 2019-02-22 17:53:08
当您调用malloc时,将返回一个指向所请求大小的内存块的指针(如果成功)。这个内存块是从堆中分配的,您可以使用该指针稍后调用free来取消分配它。局部变量是从堆栈分配的内存。您在这里所做的是从堆中分配内存块:
int * ptr = (int *)malloc(sizeof(int));然后重写,然后用堆栈上内存的局部变量的地址重写ptr。
ptr = &three; 然后尝试释放内存:
free(ptr);这是未定义的行为。
https://stackoverflow.com/questions/54824140
复制相似问题