参考教程编写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
相关产品推荐
相关产品推荐

