2015-08-20 578 views
13

我在程序中發現了錯誤,並決定編寫一個簡單的錯誤代碼,這會幫助我理解正在發生的事情。那就是:munmap_chunk():無效指針

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

char * first() 
{ 
    char * word = malloc(sizeof(char) * 10); 
    word[0] = 'a'; 
    word[1] = 'b'; 
    word[2] = '\0'; 
    return word; 
} 

char * second() 
{ 
    char * word = malloc(sizeof(char) * 10); 
    word = "ab"; 
    return word; 
} 

int main() 
{ 
    char * out = first(); 
    printf("%s", out); 
    free(out); 
    out = second(); 
    printf("%s", out); 
    free(out); 
    return 0; 
} 

first()功能是否工作正常,但second()(完全free(out))genarates錯誤:

Error in `./a.out': munmap_chunk(): invalid pointer: 0x0000000000400714 *** ababAborted (core dumped)

我不明白爲什麼第一個功能是正確的,但第二不是。誰能解釋爲什麼?

+2

您不能直接將字符串分配給char數組,請使用'strcpy(word,「ab」)'。 – gengisdave

回答

20

在函數second()中,賦值word = "ab";word分配一個新指針,覆蓋通過malloc()獲得的指針。當您稍後在指針上呼叫free()時,程序崩潰是因爲您將指針傳遞給free(),該指針尚未通過malloc()獲取。

分配字符串文字不會像您想象的那樣複製其內容。要複製一個字符串的內容,請使用strcpy()

strcpy(word, "ab"); 
7

在funxtion char * second -

char * word = malloc(sizeof(char) * 10); 
word = "ab"; 

第二條語句word = "ab";改變word從分配memory.You點遠沒有抄襲字符串"ab"分配給由malloc分配的堆區域。

而對於free未由malloc或類似函數分配的內存會使程序崩潰。

Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.

你也應該在這裏使用strcpy也可以按其他人的建議使用。