Malloc,免费和分段错误

时间:2010-10-08 10:59:26

标签: c segmentation-fault malloc free

我不明白为什么在这段代码中,对“free”的调用会导致分段错误:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *char_arr_allocator(int length);

int main(int argc, char* argv[0]){

    char* stringa =  NULL;
    stringa = char_arr_allocator(100);  
    printf("stringa address: %p\n", stringa); // same address as "arr"
    printf("stringa: %s\n",stringa);
    //free(stringa);

    return 0;
}

char *char_arr_allocator(int length) {
    char *arr;
    arr = malloc(length*sizeof(char));
    arr = "xxxxxxx";
    printf("arr address: %p\n", arr); // same address as "stringa"
    return arr;
}

有人可以向我解释一下吗?

谢谢, Segolas

4 个答案:

答案 0 :(得分:15)

您正在使用malloc正确分配内存:

arr = malloc(length*sizeof(char));

然后你这样做:

arr = "xxxxxxx";

这会导致arr指向字符串文字"xxxxxxx"的地址, 泄露 您的malloc内存。并且在字符串文字的地址上调用free会导致未定义的行为。

如果您想字符串复制到已分配的内存中,请使用strcpy

strcpy(arr,"xxxxxxx");

答案 1 :(得分:2)

char_arr_allocator()的第三行清除了malloc()结果,并将其替换为数据页中的一块静态内存。打电话给free()就好了。

使用str[n]cpy()将字符串文字复制到缓冲区。

答案 2 :(得分:2)

当你在C中写一个常量字符串,例如"xxxxxx"时,会发生的是该字符串直接进入可执行文件。当您在源代码中引用它时,它将被指向该内存的指针替换。所以你可以阅读

 arr = "xxxxxxx";

arr视为数字:

 arr = 12345678;

该号码是地址。 malloc已经返回了一个不同的地址,当你为arr分配了一个新地址时,你把它扔掉了。你得到一个段错误,因为你试图释放一个直接在你的可执行文件中的常量字符串 - 你从未分配它。

答案 3 :(得分:0)

您将arr设置为malloc()的返回值,这是正确的。但是你要重新分配它以指向字符串常量"xxxxxxx"。所以当你调用free()时,你要求运行时释放一个字符串常量,这会导致seg错误。