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

队列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:35:25