[英]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.