gpt4 book ai didi

c - scanf() 在 malloc 结构成员中不起作用

转载 作者:太空狗 更新时间:2023-10-29 16:08:20 25 4
gpt4 key购买 nike

我定义了一个结构数据类型:

typedef struct LinkNode LinkNode;
struct LinkNode {
char *name;
LinkNode *next;
};

并在 main() 中调用它: 示例 1:

int main()
{
LinkNode *pnode = (LinkNode *) malloc(sizeof(LinkNode));

scanf("%s", pnode->name);
...
free(pnode);
return 0;
}

它不起作用,除非添加一行:Example 2

int main()
{
LinkNode *pnode = (LinkNode *) malloc(sizeof(LinkNode));
pnode->name = (char *) malloc(sizeof(char));

scanf("%s", pnode->name);
...
free(pnode);
return 0;
}

但下面的代码有效:Example 3

int main()
{
LinkNode *pnode = (LinkNode *) malloc(sizeof(LinkNode));

pnode->name = "Jim";
...
free(pnode);
return 0;
}

那么问题是什么?我已将内存分配给 pnode,为什么 scanf() 不起作用?我正在使用 VS2010。谢谢!

最佳答案

当您使用scanf 时,您需要一个分配的内存块来写入。当您使用 mallocname 分配内存时,即使您只是分配一个字节(如@billz 指出的那样),它也能正常工作,因为您现在有一个有效的内存地址。但是你必须分配足够的内存,否则你迟早会覆盖一些东西并引起麻烦。

pnode->name = (char *) malloc(sizeof(char) * <max size of input>);

当您将字符串文字分配给指针 name (pnode->name = "Jim";) 时,您只是将其设置为硬编码的地址内存中的字符串。如果您尝试修改它,就会发生不好的事情,所以除非您使用 const 指针,否则永远不要这样做。

最重要的是,name 只是一个指针,要用它做任何事情,您需要它指向有效的东西。

关于c - scanf() 在 malloc 结构成员中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13907684/

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