【问题标题】:Segmentation Fault using free() in c [duplicate]在c中使用free()进行分段错误[重复]
【发布时间】:2017-01-16 12:01:05
【问题描述】:

我正在尝试使用我拥有的一些 C 代码来查找问题。调试器说当我尝试从指针中释放内存时发生错误:

int main(int argc, char *argv[]){   
    char *desc = malloc(30 * sizeof(char));
    if(desc == NULL)                    
    {
        fprintf(stderr, "Error - cannot allocate memory\n");
    }
    desc = "Debug this program.";
    printf("Description: %s\n", desc);
    free(desc);//break point here
    int cpid = fork();
    ....

【问题讨论】:

  • 你试图释放一个字符串的地址,这是非法的。
  • 此外,从字符串文字分配分配的指针几乎总是错误的。如果要将文字复制到desc,请使用strcpy
  • 请注意,sizeof(char) 始终为 1。它是对象大小的度量单位。
  • @Lundin 查看可能的重复项,这里似乎正在接受的答案看起来不像其他“重复项”的任何答案。
  • @dckuehn 随意提出更好的副本。 (This one?)。问题是 OP 不了解指针和数组是如何工作的,也不了解字符串是如何工作的。 strcpy 会解决问题的。

标签: c memory segmentation-fault free


【解决方案1】:

简单地说(并阅读其他解决方案),内存不是你要删除的。

【讨论】:

  • 这是一个不好的答案,不会尝试回答问题。这会更好作为评论。即便如此,malloc()free() 应该在 C 中使用,说“那块内存不是你要删除的”说起来容易理解。
【解决方案2】:

一开始你动态分配内存并将其地址分配给指针desc

char *desc = malloc(30 * sizeof(char));

然后你用字符串文字"Debug this program."的第一个字符的地址重新分配了指针

desc = "Debug this program.";

因此分配的内存地址丢失了。

然后你试图释放字符串字面量占用的内存

free(desc);//break point here

但是字符串字面量具有静态存储持续时间,不能通过使用标准函数 free 释放。

代替这个赋值语句

desc = "Debug this program.";

你应该使用标准的C函数strcpy作为例子

strcpy( desc, "Debug this program." );

【讨论】:

  • @MaddieSun 完全没有。不客气。:)
【解决方案3】:

你试图释放一个字符串的地址,这是非法的。

要使用您可以使用的文字字符串初始化 mallocated 字符串,例如strcpy:

strcpy(desc, "Debug this program.");

如果malloc 失败,您还应该退出/终止您的程序。

【讨论】:

  • 谢谢!!!我稍后会退出我的程序(我放 .... 是一个子进程,我的 exit() 调用)
【解决方案4】:

您重新分配了desc,然后释放了指向字符串文字的指针,这是非法的,并且会导致分段错误。

您显然没有理解malloc() 的用途,malloc() 从操作系统请求内存并返回指向您可以在程序中使用的有效内存的指针。

在你malloc() 之后你可以使用内存,但并不是所有的指针都需要我malloc()ed。例如,您可以拥有指向字符串文字的指针,它们也很有用。

但是你不能将任何东西传递给free(),除非它是由malloc()/calloc()/realloc()返回的。指向字符串文字或保存变量地址的指针不是这样的指针,将其传递给 free() 是未定义的行为。

仅当您知道必须使用malloc() 时,例如分配大量会溢出堆栈的内存或分配可在运行时计算的未知内存量。否则,不要。

【讨论】:

  • 谢谢!这真的很清楚并解释了事情。我正在上操作系统课程,老实说,我真的很困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多