[英]uthash add malloc strcpy printf prints garbage values
我正在使用uthash(http://uthash.sourceforge.net/userguide.html)在我的C程序中使用哈希表實現。
我試圖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語句都可以正確打印。
救命 !!!
當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
。 您應該始終檢查並采取適當的措施。 這是對它自己的另一種討論。
天哪,我發布了這個問題,在接下來的2分鍾內我發現了這個問題。
YePHlcK,你是對的。 但是,這里沒有分配記憶的東西是*進來的名字。
該函數被調用如下:
add_user(r.user_id, r.name); // r itself is a struct where name was a pointer and not a char array.
將名稱更改為char數組,然后使用strcpy(r.name,“blah”)初始化它; 然后調用add解決了問題。 因為strcpy會照顧內存的分配嗎?!?!! 如果我錯了,請糾正我。
謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.