C语言编写员工数据库时使用scanf读取输入触发总线错误如何解决
错误原因分析
- 核心触发原因是未初始化的野指针非法写入:你声明的
char *name、char *title两个指针变量没有分配任何可写入的内存空间,指向的是内存中的随机地址。scanf执行时会把用户输入的内容写入这两个随机地址,属于非法内存访问,这种操作触发崩溃的时机是随机的,你这次刚好在读取职位的scanf执行时触发了总线错误,导致后续代码全部没有执行。 - 还存在多处隐藏逻辑问题:
- 栈变量地址逃逸:
newEmp是addEmployee函数内的局部栈变量,函数执行结束后对应的栈空间会被系统回收复用,你将&newEmp存入全局的employeeList后,后续访问这个指针时会读取到垃圾数据,甚至触发新的崩溃。 - 结构体初始化错误:
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
相关产品推荐
相关产品推荐

