c- 使用结构指针将字符串扫描到结构中

标签 c string pointers struct

我正在尝试通过 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通过其他方式分配。您可以写入指针 并读回您所写的内容,但这不是您在第二个代码中尝试做的事情。您正在尝试写入和读取指针指向的对象,而指针的值仍然不确定。这会产生未定义的行为,其中程序崩溃是一个相当良性的例子。

如果你想使用指针那么你有两个主要的选择:

  1. 将其指向现有的结构列表:
List list;
List *p = &list;

scanf("%s", p->name);
printf("%s\n", p->name);
  1. 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/

相关文章:

jquery构建http查询字符串

swift - 如何将字符串格式更改为缩写?

c++ - 使用 + 运算符的字符串连接

c - 使用 C 返回数组

c++ - char "string"功能未更新

c++ - waitpid() 和 fork() 限制子进程的数量

c++ - Libusb如何从端口读取字符

C通过recv解析二进制

objective-c - 为 Sprite 生成随机 Y

c - 在 C 中操作字符串