2012-07-15 80 views
1

我正在使用uthash(http://uthash.sourceforge.net/userguide.html)在我的C程序中使用哈希表實現。uthash add malloc strcpy printf打印垃圾值

我想printf在添加之前和之後被添加到哈希表中的數據,並且當我在malloc之後打印它時,我得到了垃圾值。請參閱下面的代碼。

void add_user(int user_id, char *name) 
{ 
    printf("User ID : %d Name : %s, user_id,name); // Prints fine !! 
    struct my_struct *s; 
    s = malloc(sizeof(struct my_struct)); 
    s->id = user_id; 
    strcpy(s->name, name); 

    printf("User ID : %d Name : %s, s->user_id,s->name); // Prints User ID fine, but for Name, only half of it is printed right, rest is Garbage !! 

    HASH_ADD_INT(users, id, s); 
} 

如果我做到以下幾點:

void add_user(int user_id, char *name) 
{ 
    printf("User ID : %d Name : %s, user_id,name); // Prints fine !! 

    struct my_struct *s; 
    s = malloc(sizeof(struct my_struct)); 

    printf("User ID : %d Name : %s, user_id,name); // Printing same as previous printf then I get Garbage values printed for Name 

} 

,但如果我註釋掉的malloc爲好,那麼這兩個printf語句正確打印。

幫助!!!

+0

很難猜測,看不到你的'my_struct'看起來像什麼。也許你正在使用一個指針將'name'存儲在你的struct中?在這種情況下,在嘗試將字符串複製到它之前,您確實需要爲它分配(單獨!)空間。否則,你正在污染你的記憶。 – YePhIcK 2012-07-15 07:18:34

回答

1

天哪,我發佈了這個問題,並在接下來的2分鐘裏想通了。 YehlcK,你有點兒不對。然而,這並沒有在這裏分配的內存中的事情是*名字這是在未來

調用函數是這樣的:

add_user(r.user_id, r.name); // r itself is a struct where name was a pointer and not a char array. 

更改名稱的字符數組,然後通過初始化它使用strcpy(r.name,「blah」);然後調用add來解決問題。因爲strcpy會照顧內存的分配?!?!!糾正我,如果我錯了。

謝謝!

+0

+1分享您的發現 – ziu 2012-07-15 09:20:24

2

r.name是一個指針,那麼你必須爲它手動分配內存,strcpy不關心這一點。當它是一個char數組時,那麼內存已經在那裏了。此外,如果指針未初始化,則可能指向任何(無效)內存地址。 strcpy也不關心這個,所以你會嘗試將字符串複製到這個地址,無論它是什麼。

YePhIcK評論說,同樣可能適用於你的結構。當s.name是一個指針,那麼你需要分配的內存是:

s = malloc(sizeof(struct my_struct)); 
s->id = user_id; 
s->name = malloc(strlen(name) + 1); 
strcpy(s->name, name); 

如果您分配一個固定的數額,或者如果它是一個字符數組,然後做使用strcpy對於這一點,因爲它不也不在乎目的地的大小。當給定name比可用空間長時,您將以可能的緩衝區溢出結束。這是一個完整的討論,只需在這裏搜索strcpy。

最後,malloc可能會失敗,然後返回NULL。您應該始終檢查並採取適當的措施。這是它自己的另一個討論。