【问题标题】:C pointer + free: Abort signal from abort(3) (SIGABRT) [duplicate]C指针+空闲:来自中止(3)(SIGABRT)的中止信号[重复]
【发布时间】:2019-02-22 09:40:10
【问题描述】:

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

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

【问题讨论】:

  • int * ptr = malloc(...); ptr = &amp;three; 就像在做int x = 10; x = 5; 然后想知道为什么x 不等于10。有了一点rubber duck debugging,您应该(希望)能够自己弄清楚。
  • 你正在做相当于free(&amp;three),这是你不被允许做的。
  • 学习使用valgrind

标签: c


【解决方案1】:

你所拥有的是未定义的行为。 C11 标准是这样规定的:

7.22.3.3 免费功能
...
2 free函数导致ptr指向的空间被deallocate,也就是make 可用于进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果 该参数与内存管理先前返回的指针不匹配 函数,或者如果空间已通过调用 free 或 realloc 释放, 行为未定义。

在您的示例中,free 的参数是 &amp;three,它不是内存管理函数返回的指针,因此您拥有您所看到的行为。

【讨论】:

    【解决方案2】:

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

    int * ptr = (int *)malloc(sizeof(int));
    

    然后用内存驻留在堆栈上的局部变量的地址覆盖ptr

    ptr = &three; 
    

    然后尝试释放该内存:

    free(ptr);
    

    这是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多