C在使用scanf时动态分配struct,seg fault

Rhu*_*umB 0 c struct scanf segmentation-fault

#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);
}
Run Code Online (Sandbox Code Playgroud)

输入名称:asdf

分段错误:11

我不知道为什么它会给出分段错误....

Har*_*ris 5

你分配了内存struct.

但你没有分配内存p->name指向的内存


将其添加到您的代码中.

struct Person *p = malloc(sizeof(struct Person));
p->name = malloc(100);
Run Code Online (Sandbox Code Playgroud)


编辑

不应该在结构中显式分配任何类型的空间.

当你做到了

struct Person *p = malloc(sizeof(struct Person));
Run Code Online (Sandbox Code Playgroud)

空间被分配nameage两者.但请注意,这name是一个指针变量.已为指针变量分配空间,但不为指针指向的位置分配空间.

就像你做的那样

char* p;
Run Code Online (Sandbox Code Playgroud)

p创建变量,为其分配空间,但如果要使用它,则有两个选项.

1)使其指向一些现有的已分配内存

char* p;
char arr[10];
p = arr;
Run Code Online (Sandbox Code Playgroud)

2)或者在它指向的位置分配内存.

char* p = malloc(sizeof(char));
Run Code Online (Sandbox Code Playgroud)