You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言编写员工数据库时使用scanf读取输入触发总线错误如何解决

错误原因分析
  • 核心触发原因是未初始化的野指针非法写入:你声明的char *name、char *title两个指针变量没有分配任何可写入的内存空间,指向的是内存中的随机地址。scanf执行时会把用户输入的内容写入这两个随机地址,属于非法内存访问,这种操作触发崩溃的时机是随机的,你这次刚好在读取职位的scanf执行时触发了总线错误,导致后续代码全部没有执行。
  • 还存在多处隐藏逻辑问题:
    1. 栈变量地址逃逸:newEmp是addEmployee函数内的局部栈变量,函数执行结束后对应的栈空间会被系统回收复用,你将&newEmp存入全局的employeeList后,后续访问这个指针时会读取到垃圾数据,甚至触发新的崩溃。
    2. 结构体初始化错误:Employee newEmp = {*name, gender, age, *title}的写法只取了name、title两个字符串的第一个字符赋值,如果你的Employee结构体中姓名、职位字段是字符串类型,这个初始化完全不符合预期。
修复建议
  • 把char *name、char *title改为长度足够的栈数组:char name[101]; char title[101];,刚好匹配你scanf里写的%100s长度限制,避免越界。
  • 存储员工数据到全局列表时,使用malloc为newEmp申请堆内存,不要用局部栈变量。
  • 结构体的字符串字段需要使用strcpy/strncpy完成字符串拷贝,不能直接解引用取单个字符。

内容的提问来源于stack exchange,提问作者phphphphp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:15:03