我定义了一个结构数据类型:
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
时,您需要一个分配的内存块来写入。当您使用 malloc
为 name
分配内存时,即使您只是分配一个字节(如@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/