C动态分配结构,使用scanf时出现段错误

标签 c struct segmentation-fault scanf

#include <stdio.h>  
#include <stdlib.h>
struct Person {
  char* name;
  int age;
};

void printit(struct Person *person) {
    printf("%s %d \n",person->name,person->age);
}

int main(int argc, char** argv) {
  struct Person *p = malloc(sizeof(struct Person));
  printf("Enter name: ");
  scanf("%s", p->name);
  printf("Enter age: ");
  scanf("%d", &(p->age));
  printit(p);
  free(p);
}

输入名称:asdf

段错误:11

我不知道为什么会出现段错误......

最佳答案

您为 struct 分配了内存。

但是你没有在p->name指向的地方分配内存


将此添加到您的代码中。

struct Person *p = malloc(sizeof(struct Person));
p->name = malloc(100);


编辑

任何类型都不应在结构内显式分配空间。

当你做的时候

struct Person *p = malloc(sizeof(struct Person));

nameage 分配了空间。但请注意 name 是一个指针变量。已为指针变量分配空间,但未分配指针指向的位置。

就像你做的那样

char* p;

创建了变量p,并为它分配了空间,但是如果你想使用它,你有两个选择。

1) 要么让它指向一些现有的已分配内存

char* p;
char arr[10];
p = arr;

2) 或者在它指向的地方分配内存。

char* p = malloc(sizeof(char));

关于C动态分配结构,使用scanf时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160688/

相关文章:

c - 如何解决此错误 : segmentation fault?

assembly - AT&T Assembly Printing 来控制台 Segfault

c - c中大图深度优先搜索中的段错误

c++ - C/C++远程消息队列的推荐

go - 从接口(interface)中获取所有字段

c - 如何使用 atmega 退出 USART ISR?

ios - 从 UInt8 到 UInt8 [] 的类型转换给出错误

不能使用 MS Visual C++ 在 C 中包含 iostream?

c - 预处理器指令的语言与 C 的语法弱相关是什么意思?

c - 将动态分配的数组作为C中的参数传递