![ad3701ff875b55d8d2acbca7fde9b4ad.png](https://i-blog.csdnimg.cn/blog_migrate/ddf179a292f021afa495591467dadd64.jpeg)
说到stack(栈),大家很可能就会想起stack overflow(栈溢出),著名的程序问答网站http://stackoverflow.com 就是以此命名的。因为栈通常是从高地址向低地址增长的,因此"栈溢出"分为两种:超出低地址范围的overrun(上溢)和超出高地址范围的underrun(下溢),"上溢"主要是由过深的函数调用引起(比如递归调用):
![4b2bcae3cc6fe500024f372f191bef80.png](https://i-blog.csdnimg.cn/blog_migrate/35eb1c504e922f54197f293f433302f7.jpeg)
而"下溢"则会出现在数组/字符串越界的时候(数组的内存分布是从低地址到高地址的)。
![d68f0338818708421e2070cd5b9f8124.png](https://i-blog.csdnimg.cn/blog_migrate/a61f3a0cd9b200d87068996596c7c846.jpeg)
因为"栈溢出"造成的数据破坏很可能不会在被破坏的那一瞬间立刻显现,而是像幽灵一样潜伏着,直到之后的某个时刻,被破坏的数据再次被访问到。为了将这些幽灵