首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >uthash add malloc strcpy printf打印垃圾值

uthash add malloc strcpy printf打印垃圾值
EN

Stack Overflow用户
提问于 2012-07-15 15:08:33
回答 2查看 625关注 0票数 1

我正在使用uthash (http://uthash.sourceforge.net/userguide.html)在我的C程序中使用哈希表实现。

我试图打印在加法之前和之后添加到哈希表中的数据,当我在malloc之后打印它时,我得到了垃圾值。请参考以下代码。

代码语言:javascript
复制
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 );
}

如果我执行以下操作:

代码语言:javascript
复制
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语句都可以正确打印。

救命!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-15 15:27:34

天哪,我把这个问题贴出来了,在接下来的两分钟里我就想出了答案。

YePHlcK,你是对的。然而,这里没有分配内存的东西是*name,它即将进入。

该函数的调用方式如下:

代码语言:javascript
复制
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会负责内存分配?!?!!如果我错了,请纠正我。

谢谢!

票数 1
EN

Stack Overflow用户

发布于 2012-07-15 17:55:51

r.name是一个指针时,你必须手动为它分配内存,strcpy不关心这一点。当它是char数组时,那么内存已经在那里了。另外,如果指针没有初始化,那么它可能指向任何(无效的)内存地址。strcpy也不关心这一点,所以您可以尝试将字符串复制到这个地址,不管它在哪里。

正如YePhIcK所评论的,同样的道理也适用于你的结构。当s.name是一个指针时,你需要为它分配内存:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11490153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档