【问题标题】:Malloc, free and segmentation faultMalloc、空闲和分段错误
【发布时间】:2011-04-22 20:02:36
【问题描述】:

我不明白为什么在这段代码中,对“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;
}

谁能给我解释一下?

谢谢, 塞戈拉斯

【问题讨论】:

标签: c segmentation-fault malloc free


【解决方案1】:

char_arr_allocator() 的第三行清除了您的malloc() 结果并用数据页中的一块静态内存替换它。打电话给free() 会爆炸。

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

【讨论】:

    【解决方案2】:

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

     arr = "xxxxxxx";
    

    arr 视为一个数字,如下所示:

     arr = 12345678;
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        然后你这样做:

        arr = "xxxxxxx";
        

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

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

        strcpy(arr,"xxxxxxx");
        

        【讨论】:

        • 你在 UB 部分是对的:使用任何指针值(NULL 除外)而不是来自 mallocrealloc 调用 free 会给出未定义的行为。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 2011-02-13
        相关资源
        最近更新 更多