2015-09-24 28 views
-1

我讓一個人一個人結構用typedef PERSON_T:字符串使用後變成垃圾免費()

int main(int argc, char* argv[]) { 
    person_t a; 
    memset(&a, 0, sizeof(person_t)); 

    person_set_name(&a, "Konrad Hoppenstauffer"); 
    person_set_age(&a, 42); 

void person_set_name(person_t* person, char* name) { 
    if(person->name) { 
     free(person->name); 
    } 
    person->name = malloc(sizeof(char) * strlen(name) + 1); 
    strcpy(person->name, name); 
} 

上述工作就好了。

person_t* string_to_person(char* str) { 
    person_t* person = malloc(sizeof(person_t)); 

    int len = 0; 
    while(str[len] != '\t') { 
     len++; 
    } 

    char* name = malloc(len + 1); 

    int i; 
    for(i = 0; i < len; i++) { 
     name[i] = str[i]; 
    } 
    name[len] = '\0'; 

    person_set_name(person, name); 
    person_set_age(person, atoi(str+len+1)); 

    return person; 
} 

這裏str是這樣的: 「南旋名\ T22」 當我使用這個功能

問題發生。這是由tab分隔的名稱。然後我將兩者分開並將字符放在char *名稱中。

person_t是一個struct的typedef。

如果我從person_set_name中刪除了free(person-> name),那麼一切正常。但是如果我把它放進去,名字變成垃圾,例如:「É8>」。

我假設我在複製每個字符的for循環中發生了錯誤。但是憑藉我對C的有限經驗,我看不到什麼。幫助表示讚賞。

+0

我不認爲這會導致你問的問題,但你檢查如果person-> name是NULL而沒有初始化結構,malloc不會爲你初始化它。 – MByD

+0

我在說'string_to_person' – MByD

+0

這個修正了它:memset(person,0,sizeof(person_t));謝謝 – prideHURTS

回答

0

你正試圖釋放一個垃圾指針。

後:

person_t* person = malloc(sizeof(person_t)); 

malloc不初始化任何特定數據的新內存塊,所以你的程序必須把*person因爲在這一點上包含垃圾(因爲它可能包含任何數據)。特別是,person->name(即(*person).name)可能不是NULL

了一小會兒,運行此代碼:

if(person->name) { 
    free(person->name); 
} 

- 如果person->name不是NULL,那麼你就釋放它。由於person->name沒有指向您使用malloc分配的內容,因此此時您已經在Undefined Behavior Land ™中完好無損。

一種可能的解決方法是在分配人後立即設置person->name = NULL;