You need to enable JavaScript to run this app. 参考教程编写C++栈实现代码,运行出栈溢出与异常内存地址,数组设100仍无效
优惠活动
大模型
产品
解决方案
定价
更多

参考教程编写C++栈实现代码,运行出栈溢出与异常内存地址,数组设100仍无效

异常根因

问题出在push方法的栈满判断逻辑上,是新手极易踩的语法混淆坑:
你把相等判断的双等号==,误写成了赋值用的单等号=。
原错误代码:

if(top = n-1)

这行代码的实际执行逻辑完全不是“判断top是否已经到栈顶位置”,而是强行把n-1(也就是99)赋值给top变量,同时因为赋值结果99是非零值,if分支的判断永远为真。
这就导致:

  • 每次调用push都会直接触发栈溢出提示,直接return,根本不会执行后续的top自增、元素入栈逻辑
  • top值被永久改成99,后续调用Top()时,会读取动态数组下标99位置的未初始化垃圾值,出现随机乱码/异常内存输出
  • 后续调用pop()时,只会把99一步步往下减,全程不会匹配到栈空的判断条件,逻辑完全错乱。

你感觉自己抄的代码和教程完全一致,大概率是输入时漏了一个等号。这类单/双等号混淆的问题不会触发语法编译报错,但是运行逻辑会完全偏离预期,排查时需要重点检查这类条件判断的写法。

修复方法

把push方法里的判断行改成双等号的相等判断即可:

// 修复后
if(top == n-1)
可优化的细节
  • 不要用宏#define n 100定义栈容量,宏是无类型的全局文本替换,很容易出现命名冲突,建议替换为类内静态常量static const int MAX_CAPACITY = 100;,安全性和可读性都更好
  • 自定义栈类不要直接命名为stack,在using namespace std;的环境下,很容易和标准库的std::stack产生名称冲突
  • 补上类的析构函数,在对象销毁时释放动态申请的数组内存,避免内存泄漏:
~stack(){
    delete[] arr;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 08:54:05