gpt4 book ai didi

c - uthash add malloc strcpy printf 打印垃圾值

转载 作者:太空宇宙 更新时间:2023-11-04 02:12:53 27 4
gpt4 key购买 nike

我正在使用 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);

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

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

关于c - uthash add malloc strcpy printf 打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11490153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com