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

标签 c struct malloc scanf

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

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/

相关文章:

c - 不用fopen()读取文件(C语言)

使用结构数组调用 C 函数

c++ - C++中分配内存和指针的问题

c - 是否可以使用格式说明符作为函数的参数

c - *** 错误 `./recover' : free(): invalid next size (normal)

c - 我应该如何学习C?

c - 如何将临时值分配给二维数组

c - 我的结构与前一个结构重叠了一些数据(编辑)

c - C 中的内存分配错误

c - 在尝试释放 C 中分配的数组内存时抛出异常说 "project.exe has triggerd a breakpoint"