1

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

帮助 !!!

4

2 回答 2

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);

如果你分配一个固定的数量或者它是一个 char 数组,那么不要使用strcpy,因为它也不关心目标大小。name当给定的空间长于可用空间时,您将以潜在的缓冲区溢出结束。这是一个完整的讨论,只需在此处搜索 strcpy。

最后,malloc可能会失败然后返回NULL。您应该始终检查这一点并采取适当的措施。这是另一个自己的讨论。

于 2012-07-15T09:55:51.457 回答
1

天哪,我发布了这个问题,在接下来的 2 分钟内我想通了。

YePHlcK,你说得对。但是,这里没有分配内存的是 *name 。

该函数是这样调用的:

add_user(r.user_id, r.name); // r itself is a struct where name was a pointer and not a char array.

将 name 更改为 char 数组,然后使用 strcpy(r.name,"blah"); 对其进行初始化 然后调用 add 解决了这个问题。因为 strcpy 会处理内存分配?!?!!如果我错了,请纠正我。

谢谢!

于 2012-07-15T07:27:34.470 回答