我正在尝试通过 scanf()
将字符串读入结构成员。
如果我像这样启动一个结构,它将编译并运行得很好:
typedef struct list {
char name[10];
...
} List;
List p;
scanf("%s", p.name);
printf("%s\n", p.name);
如果我通过指针启动结构,那么它仍然可以正常编译,但生成的程序会崩溃:
typedef struct list {
char name[10];
...
} List;
List *p;
scanf("%s", p->name);
printf("%s\n", p->name);
为什么会这样?
最佳答案
如果您将p
声明为struct list
类型,那么会自动为其分配struct list
的内存。您可以写入该内存并随后读回您所写的内容,就像您在第一个示例中所做的那样。
如果您将 p
声明为 struct list *
类型,则会自动为其分配指针 的内存。没有为 struct list
分配内存,部分原因是您实际上可能不需要任何内存——您可能希望将指针分配给指向一个 struct list
通过其他方式分配。您可以写入指针 并读回您所写的内容,但这不是您在第二个代码中尝试做的事情。您正在尝试写入和读取指针指向的对象,而指针的值仍然不确定。这会产生未定义的行为,其中程序崩溃是一个相当良性的例子。
如果你想使用指针那么你有两个主要的选择:
- 将其指向现有的
结构列表
:
List list;
List *p = &list;
scanf("%s", p->name);
printf("%s\n", p->name);
- 为
struct list
动态分配内存,并在完成后释放它:
List *p = malloc(sizeof *p);
if (!p) {
// handle allocation failure
} else {
scanf("%s", p->name);
printf("%s\n", p->name);
free(p);
}
关于c- 使用结构指针将字符串扫描到结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474528/