一.栈的简介


栈空间在进程中主要用来存放局部变量的值,在windows下使用visual studio作为编译器,默认的栈空间大小为1M。

二.示例代码

#include <iostream>
void teststacksize2()
{    
    char szArray[600000] = {0};//600,000byte
    std::cout<<"teststacksize2"<<std::endl;
}
void teststacksize1()
{    
    char szArray[600000] = {0};//600,000byte
    std::cout<<"teststacksize1"<<std::endl;
    teststacksize2();
}
int main(int argc, char* argv[])
{    
    teststacksize1();
    return 0;
}

三.程序运行效果如图

图片描述

四.解决此问题的方法

1.修改工程中stack reserve size的大小,工程右键Properties->Linker->System->Stack Reserve Size中进行修改,改为10M或者更大。此示例程序中teststacksize1和teststacksize2方法中一共申请了1,200,000个字节。此方法不推荐,因为可能会有更大字节的局部变量。
附:在CMakeLists.txt中这样设置:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10000000")

2.将char szArray[]改为static,亦可避免崩溃,因为静态的局部变量类似于全局变量,在全局区。

3.将szArray new出来存在堆上,推荐此种方法。


one_piece
26 声望8 粉丝