scanf函数给结构体中指针变量赋值出现段错误

#include
#include

struct book{
char *name;
int num;
};

int main()
{
struct book bk;
bk = (struct book
)malloc(sizeof(struct book));
if(!bk)
{
printf("no space for malloc\n");
return 0;
}
scanf("%s",bk->name); /*此处显示:段错误*/
printf("%s\n",bk->name);
free(bk);
return 0;
}

其实这是典型的只声明指针而没有分配内存的错误,bk = (struct book)malloc(sizeof(struct book)); 这一句其实为bk申请了内存,用于存放一个char指针和一个int变量,但没有给char指针name分配内存空间,所以name是一个野指针,任何对其指向的内存的操作都有可能导致出错。
解决方法有两个

//一个是在结构体定义中将char指针修改为char数字,大小视情况自定
struct book{
char name[100];
int num;
};

//第二个方法是在main函数中动态申请内存,同样,大小自定。也可以用一个临时的char数组用于输入,输入后根据字符串的长度动态申请内存,并将临时数组内容复制过来,这里就不写了。
bk.name = new char[100];
//.....业务代码
delete[]bk.name; bk.name = NULL; // 使用完毕后释放空间

一个比较保险的办法,先再创建一个char*用于读取,读取完再赋值给结构体

最简单的方法就是把name指针改成数组,还省得开辟和释放指针空间

struct book bk=(struct book)malloc(sizeof(struct book))

bk->name = (char ※)malloc(sizeof(256));
这个一切是动态申请大小的,如果你觉得最大不会超过256,就申请256;
如果没有申请直接使用是不行的,会有异常;