繁体   English   中英

Malloc,空闲和分段错误

[英]Malloc, free and segmentation fault

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

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

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

然后您可以这样做:

arr = "xxxxxxx";

这将导致arr指向字符串常量的地址"xxxxxxx"泄露malloc版内存。 而且,对字符串文字的地址进行free调用会导致未定义的行为。

如果要将字符串复制到分配的内存中,请使用strcpy作为:

strcpy(arr,"xxxxxxx");

char_arr_allocator()的第三行擦除您的malloc()结果,并将其替换为数据页中的大量静态内存。 在此调用free()炸毁。

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

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

 arr = "xxxxxxx";

arr视为数字,如下所示:

 arr = 12345678;

该号码是地址。 malloc返回了一个不同的地址,当您为arr分配一个新地址时,您将其丢弃。 之所以出现段错误,是因为您试图释放直接在可执行文件中的常量字符串-您从未分配过它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM