C++ 之栈溢出

一  栈是什么

    如下图所示,除程序不可使用的内存区外,有效内存区域可分为栈(statck)、堆(heap)、数据段、代码段。

     整个内存都是用来存储数据的,栈也不例外。栈主要用来存储程序的局部数据。对于C/C++来说,局部数据是指在函数内部定义的数据,例如在函数内部定义的变量、指针、函数参数等,它们都要保存到栈中。


二  栈溢出

    对于每个程序,栈能使用的内存是有限的,一般是1~8M,这是在编译时确定的,程序运行期间不能改变。如果程序使用的栈内存超出限制,就会发生栈溢出(Statck Overflow),导致程序崩溃。

    栈内存大小和编译器有关:VS/VC下,栈内存默认为1M;Linux GCC下,栈内存默认为8M。我们可以更改栈内存大小。

    发生栈溢出的情况:

    (1)最常见的就是递归。每次递归就相当于调用一个函数,函数每次调用时都会将局部数据放入栈中。递归10000次,就将10000份这样的数据放入栈中。然而只有当递归结束时,这些数据占用的内存才会被释放。如果递归次数过多,并且局部数据也多,那么将占用大量的栈内存,很容易造成栈溢出。

    (2)在函数内部定义超大数组也会导致栈溢出,例如在VC下,我们定义个int arr[1024][1024]; 这样的二维数组,如下图所示,程序崩溃,提示栈溢出。


三  更改栈大小

 VS下更改栈大小的方法:

    更改【属性 - 链接器 - 系统 - 堆栈保留大小】,如下图所示,我将栈大小改为8M:

    再次运行刚才的程序,程序就不会崩溃了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值