1.3.2 堆栈和溢出

“现在大家清楚了,刚才的程序是输入到mnop时出错了,那究竟是什么原因呢?在‘name[]’比较短时不会有问题,反而在比较长的时候出错。”

大家眉头紧缩:“不知道。”

老师说:“嗯,这个就涉及到Windows的运行机制了。”

“哇!岂不是很难啊!”

“No,只要理解了两个概念,再结合实际分析一下,就很简单了。我会用很简单的语言给大家解释。”

“第一个概念是 中断 。我举一个日常生活中的例子来说明,假如你正在给朋友写信,电话铃响了。这时,你放下手中的笔去接电话。通话完毕,再继续写信。这个例子就表现了中断及其处理过程:电话铃声使你暂时中止当前的工作,而去处理更为急需处理的事情(接电话),把急需处理的事情处理完毕之后,再回头来继续原来的事情。”

“第二个概念是 堆栈 。计算机为了能回头继续处理原来的事情,就需要把原来指令的指针EIP保存在堆栈中;当要回去原来的地方时,就把保存在堆栈中的EIP恢复即可。并且各个函数的局部变量的分配也是在堆栈中。”

台下似懂非懂。

“好,我们看看刚才那个程序就清楚了。”

小知识——PUSH和POP

堆栈是一数据结构,遵循“先进后出,后进先出”的规则,就像我们平时叠盘子一样,先放在下面的最后才能取出来,最后放上去的最先取出来。而在操作系统中,存和取的动作就是PUSH和POP。PUSH放一个数据到堆栈中去,POP取一个堆栈中的数据出来。