C指针+自由:来自abort(3)的中止信号(SIGABRT)

时间:2019-02-22 09:40:10

标签: c

我用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).

您能帮我发现我的错误吗? 谢谢!

2 个答案:

答案 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);

这是不确定的行为。