在 c 中使用 free() 的分段错误

Segmentation Fault using free() in c

我试图用我拥有的一些 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 然后释放了一个指向字符串文字的指针,这是非法的并且会导致分段错误。

你显然没能理解 malloc() 的用途,malloc() 从 OS 请求内存和 returns 一个指向你可以在你的程序中使用的有效内存的指针程序。

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

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

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

您正在尝试释放文字字符串的地址,这是非法的。

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

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

您还应该 exit/terminate 您的程序以防 malloc 失败。

一开始你动态分配了内存并将它的地址分配给了指针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." );

简单地说(并阅读其他解决方案),内存不属于您,无法删除。