簡體   English   中英

uthash add malloc strcpy printf打印垃圾值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM