我正在使用uthash(http://uthash.sourceforge.net/userguide.html)在我的C程序中使用哈希表实现。
我试图在添加之前和之后打印添加到哈希表中的数据,当我在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);
如果您分配了一个固定的数量,或者它是一个char数组,那么请不要为此使用strcpy
,因为它也不关心目标大小。当给定的name
比可用空间长时,您将以潜在的缓冲区溢出结束。这是一个完整的讨论,只需在这里搜索strcpy。
最后,malloc
可能失败,然后返回NULL
。你应该经常检查并采取适当的行动。这是它自己的另一个讨论。
天哪,我发布了这个问题,在接下来的两分钟里我就解决了。
是的,你说得对。然而,这里没有分配内存的是即将到来的*名称。
函数的调用方式如下:
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会负责内存的分配?!?!!如果我错了,请纠正我。
谢谢!