uthash add malloc strcpy printf打印垃圾值

时间:2012-07-15 07:08:33

标签: c struct malloc printf

我正在使用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语句都可以正确打印。

帮助!!!

2 个答案:

答案 0 :(得分: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。您应该始终检查并采取适当的措施。这是对它自己的另一种讨论。

答案 1 :(得分:1)

天哪,我发布了这个问题,在接下来的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会照顾内存的分配吗?!?!!如果我错了,请纠正我。

谢谢!