簡體   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