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

Dev C++ 5.11中手动实现栈的C++程序无报错却终止执行

你的C++栈实现程序问题分析
  • 栈指针未初始化
    main函数里定义的stoiva指针没有初始化为NULL,属于野指针。第一次调用push时,新节点的next会指向这个野地址,导致链表结构混乱,后续操作极易触发未定义行为。修正方式是把定义改成:

    struct node *stoiva = NULL, *tmp;
    
  • 打印循环触发空指针访问
    你用来打印栈的do-while循环逻辑有问题:

    do{
        cout << tmp->data << endl;
        tmp = tmp->next;
    }while (tmp->next != NULL);
    

    当tmp走到链表最后一个节点时,执行tmp = tmp->next后,tmp会变成NULL,此时循环条件判断tmp->next就是直接访问空指针的成员,这会直接导致程序崩溃终止。而且这个循环还会漏掉最后一个节点的打印。
    正确的打印逻辑应该改成while循环:

    tmp = stoiva;
    while(tmp != NULL){
        cout << tmp->data << endl;
        tmp = tmp->next;
    }
    
  • 冗余内存分配导致内存泄露
    main开头的tmp = (struct node *)malloc(sizeof(struct node));完全没必要,后面你直接把tmp赋值为stoiva,导致这块分配的内存永远无法释放,属于内存泄露,直接删掉这句就行。

  • 额外优化点:pop函数的内存释放
    你的pop函数只是移动了栈顶指针,但没有释放弹出节点的内存,长期运行会积累内存泄露。可以修改为:

    struct node *pop(struct node *root){
        if(root == NULL) return NULL; // 空栈直接返回,避免出错
        struct node *ptr = root;
        root = ptr->next;
        free(ptr); // 释放弹出的节点内存
        return root;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:38:16