我们通常编译一个程序的时候,编译器会默认设置栈的大小。那么这个栈的大小在运行时是如何被检测的,例如我声明一个非常大的局部数组,超过了栈的限制,程序就崩溃了。我的问题是: 难道是操作系统会不停的检测,一个可执行映像用到的栈,有没有超过2进制文件(a.out或者PE)当中设置的栈的大小,如果超过了就崩溃?既然32位程序的栈空间可以很大,为什么要设定这样的限制呢? 超过限制就崩溃,OS在运行时是如何做到的?

解决方案 »

  1.   

    栈太大做什么呢。增加系统开销啊。栈跟堆不一样,内存不够的时候估计不能在缓存开辟。而且显然这个栈应该是一段连续空间,应该不是链式的,这也必然限制它的大小啊。至于崩溃,不太确定,大概是越界以后覆盖了有用的内容了。
      

  2.   

    一开始,系统会给区域顶部两个页面调拨物理存储器,并把指针指向第一个页面,称为栈顶。第二个页面称为防护页面,系统永远不会给栈底页面调拨物理存储器(目的是为了保护栈内存操作不越界)。若代码访问了栈底后面的内存,将引起内存破坏,称为“栈下溢”。
      

  3.   

    内存破坏倒不一定会在当时就引起异常。引起异常的是读取了保护内存(试图对保护内存块读、写都会引起异常)