C语言整数输入序列中出现Bus Error问题求助
错误原因与修复方案
Bus Error的核心原因是未初始化指针就直接访问,和输入空格无关,具体问题及修复如下:
1. 野指针未初始化
main函数中employee *e;和customer *c;都是未初始化的野指针,直接传递给函数会触发非法内存访问:
- 修复:初始化
e为NULL,c需要先分配内存并初始化队列结构:employee *e = NULL; customer *c = (customer*)malloc(sizeof(customer)); c->front = NULL; c->rear = NULL; c->next = NULL;
2. new_employer函数无法修改外部链表头
原函数参数是employee *top,top = ptr;仅修改函数内部的副本,外部的e指针不会更新,导致员工链表始终为空:
- 修复:改为传递指针的指针,修改外部头指针:
调用时改为:void new_employer(employee **top, int id) { employee *ptr = (employee*)malloc(sizeof(employee)); ptr->ID = id; ptr->freeAt = 0; ptr->totalTime = 0; ptr->next = *top; *top = ptr; }for(int i=1;i<=7;i++){ new_employer(&e,i); }
3. 员工初始化循环条件错误
原循环for(int i=1;i>7;i++)的条件i>7永远不成立,导致没有员工被创建,后续help_customer会进入死递归:
- 修复:将条件改为
i<=7。
4. help_customer的内存泄漏与死递归
- 原函数中
ptr = (employee*)malloc(sizeof(employee));后立刻赋值为top,造成内存泄漏,直接删除该行即可。 - 当所有员工忙碌时,
top->next最终变为NULL,触发if(top==NULL)的递归,进入死循环,需添加终止条件(比如限制等待次数)或改为迭代查找。
5. 调试输出优化
终端输出中break11是因为printf没有换行,添加\n可让调试信息更清晰:
printf("break1\n");
修复后的main函数示例
int main(){ employee *e = NULL; for(int i=1;i<=7;i++){ new_employer(&e,i); } customer *c = (customer*)malloc(sizeof(customer)); c->front = NULL; c->rear = NULL; c->next = NULL; int id; int start; int process; while(1){ // 检查scanf是否成功读取,避免输入异常 int ret = scanf("%d", &id); if(ret != 1 || id == -1){ break; } printf("break1\n"); scanf("%d", &start); printf("break2\n"); scanf("%d", &process); printf("break3\n"); new_customer(c,e,id,start,process); } customerStats(c); employeeStats(e); // 记得释放动态分配的内存,避免内存泄漏 return 0; }
内容的提问来源于stack exchange,提问作者YusufDanis
相关产品推荐
相关产品推荐

