首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C指针+空闲:来自abort(3)的Abort信号(SIGABRT)

C指针+空闲:来自abort(3)的Abort信号(SIGABRT)
EN

Stack Overflow用户
提问于 2019-02-22 17:40:10
回答 2查看 1.1K关注 0票数 0

我用C语言编写了以下代码:

代码语言:javascript
复制
#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;
}

当我执行时,我得到以下错误:

代码语言:javascript
复制
Abort signal from abort(3) (SIGABRT).

你能帮我找出我的错误吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-02-22 17:46:12

你所拥有的是未定义的行为。C11标准如下所述:

7.22.3.3自由函数

..。

2 free函数使ptr指向的空间被释放,即可用于进一步的分配。如果ptr为空指针,则不会发生任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果空间已通过调用或realloc释放,则为。

在您的示例中,free的参数是&three,它不是内存管理函数返回的指针,因此您会看到这样的行为。

票数 3
EN

Stack Overflow用户

发布于 2019-02-22 17:53:08

当您调用malloc时,将返回一个指向所请求大小的内存块的指针(如果成功)。这个内存块是从堆中分配的,您可以使用该指针稍后调用free来取消分配它。局部变量是从堆栈分配的内存。您在这里所做的是从堆中分配内存块:

代码语言:javascript
复制
int * ptr = (int *)malloc(sizeof(int));

然后重写,然后用堆栈上内存的局部变量的地址重写ptr

代码语言:javascript
复制
ptr = &three; 

然后尝试释放内存:

代码语言:javascript
复制
free(ptr);

这是未定义的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54824140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档