吃代码的吾 2016-10-02 04:18 采纳率: 0%
浏览 2195
已结题

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;
}

  • 写回答

5条回答 默认 最新

  • leewers 2016-10-02 04:46
    关注

    其实这是典型的只声明指针而没有分配内存的错误,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; // 使用完毕后释放空间
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器