栈Push函数异常:top初始为-1时数组下标赋值导致值错误
栈Push函数异常的问题分析与修复方案
嘿,我一眼就揪出你这个问题的核心了——数组越界访问引发的未定义行为,再加上push逻辑的顺序错误,才搞出了这种不符合预期的输出。让我给你拆解清楚:
为什么会出现top变成12的诡异情况?
- 你初始化栈时把
top设为-1,这是栈为空的标准写法(表示当前栈里没有元素,下一个元素要放在top+1的位置)。 - 但你写的
arr[top++]=item用了后置自增运算符,它的执行顺序是:- 先拿当前
top的值(-1)当数组下标,访问arr[-1]——这已经是数组越界了,因为数组下标从0开始,arr[-1]指向的是数组内存块前面的区域。 - 然后把
top自增为0。 - 最后把
item(也就是12)赋值给arr[-1]对应的内存地址。
- 先拿当前
- 而根据C++类的成员内存布局,你的
stack类里top是第一个成员变量,arr是第二个,所以arr[-1]刚好对应top变量的存储地址!这就等于你把12直接覆盖了top的值,所以打印的时候top就变成12了,完全打乱了栈的逻辑。
正确的Push函数写法
栈的push逻辑应该是:先让top指向新的空闲位置,再把元素放进去。有两种靠谱的写法:
写法一:先手动自增top,再赋值
void stack::push(int item) { top++; // 先让top移动到新的空闲位置 arr[top] = item; cout << "\n" << item << " pushed in stack"; cout << "\n top value is " << top; }
写法二:使用前置自增运算符
void stack::push(int item) { arr[++top] = item; // 前置自增:先把top加1,再用新的top作为下标 cout << "\n" << item << " pushed in stack"; cout << "\n top value is " << top; }
修复后的输出验证
用修正后的代码运行三次push操作,输出会完全符合你的预期:
12 pushed in stack top value is 0 19 pushed in stack top value is 1 31 pushed in stack top value is 2
额外建议:加上满栈判断
为了避免后续出现数组越界的问题,建议给push函数加上栈满的判断:
void stack::push(int item) { if (top >= 499) { // arr的大小是500,最大下标是499 cout << "\n Stack Overflow!"; return; } arr[++top] = item; cout << "\n" << item << " pushed in stack"; cout << "\n top value is " << top; }
内容的提问来源于stack exchange,提问作者Naman Kumar Narula
相关产品推荐
相关产品推荐

