队列ADT程序无编译错误但运行时a.exe停止工作排查请求
队列ADT程序崩溃原因分析
以下是导致程序运行崩溃的核心问题及对应修复说明:
main函数参数违规+队列指针未初始化
标准C语言的main函数签名应为int main()或int main(int argc, char* argv[]),你定义的int main(queue* qp)不符合规范。更致命的是,这个qp是未初始化的野指针,程序启动后它指向随机内存地址,直接调用enq(qp, &ele)、访问qp->count等操作会触发非法内存访问,这是程序崩溃的核心原因。
修复:在main内部调用createq()创建并初始化队列:int main() { queue* qp = createq(); // 后续业务代码 }switch分支缺少break导致逻辑混乱
你的switch语句中所有分支都没有break,执行完case 1后会继续执行case 2和case 3的代码。比如执行入队操作后,会立刻执行出队操作,当队列为空时,deq(qp)返回NULL,后续*(int*)(deq(qp))会对空指针解引用,直接触发崩溃。
修复:每个case分支末尾添加break:switch(choice) { case 1: // 入队代码 break; case 2: // 出队代码 break; case 3: // 显示代码 break; }入队传递局部变量地址引发悬挂指针
case 1中传递&ele给enq函数,ele是main中的局部栈变量,当后续栈空间被其他数据覆盖时,队列节点的dataptr会变成悬挂指针,访问该地址会导致未定义行为(可能崩溃或输出乱码)。
修复:为每个入队元素动态分配内存:case 1: printf("enter the element to insert\n"); int* ele_ptr = (int*)malloc(sizeof(int)); scanf("%d", ele_ptr); if(enq(qp, ele_ptr)) printf("%d has been inserted\n", *(int*)qp->r->dataptr); else printf("element not inserted\n"); break;死循环未更新用户选择
main中的while(1)循环内没有重新读取choice,程序会一直执行第一次输入的分支逻辑,无法响应用户后续操作,属于逻辑错误。
修复:在循环内重新获取用户选择:while(1) { printf("\nEnter\n1.enqueue\n2.dequeue\n3.display\n"); scanf("%d", &choice); switch(choice) { // 各case分支 } }
内容的提问来源于stack exchange,提问作者Bijapur
相关产品推荐
相关产品推荐

