文章目录
-
- [✅ 方案1:大数组不要放在局部(栈),挪到全局区(最简单,竞赛首选)](#✅ 方案1:大数组不要放在局部(栈),挪到全局区(最简单,竞赛首选))
- [✅ 方案2:大数组放到堆内存(new / malloc)](#✅ 方案2:大数组放到堆内存(new / malloc))
- [✅ 方案3:修改链接器参数,**扩大栈的容量**(适合深度递归)](#✅ 方案3:修改链接器参数,扩大栈的容量(适合深度递归))
- [✅ 方案4:递归改迭代(最稳妥,从根源消除栈压力)](#✅ 方案4:递归改迭代(最稳妥,从根源消除栈压力))
- [✅ 方案5:减少单个函数栈占用](#✅ 方案5:减少单个函数栈占用)
✅ 方案1:大数组不要放在局部(栈),挪到全局区(最简单,竞赛首选)
全局变量不在栈,放在全局静态存储区,几乎没有大小限制。
cpp
// 写在main外面!全局区,不会爆栈
const int N = 1000000;
int arr[N];
int main(){
// 这里直接使用arr,栈不会爆炸
return 0;
}
❌ 错误写法(在main/函数内定义,栈上分配,直接爆栈)
cpp
int main(){
int arr[1000000]; // 局部数组,栈!!极易栈溢出
return 0;
}
✅ 方案2:大数组放到堆内存(new / malloc)
堆空间很大,手动分配,用完释放。
cpp
#include <iostream>
using namespace std;
int main(){
const int N = 1000000;
int *arr = new int[N]; //堆分配
//使用数组
delete[] arr; //用完释放
arr = nullptr;
return 0;
}
✅ 方案3:修改链接器参数,扩大栈的容量(适合深度递归)
适合:递归深度很大(如深度搜索DFS),没法改成全局/堆的场景
-
Dev-C++ 顶部菜单:工具 → 编译选项
-
勾选:
Add the following commands when calling the linker -
在输入框填入链接参数:
-Wl,--stack=536870912
536870912 = 512MB,按需调整,例如:
- 256MB:
-Wl,--stack=268435456 - 64MB:
-Wl,--stack=67108864
注意:这个只是增大栈上限,不是无限栈。递归极端深依然会爆。而且只对当前项目生效。
✅ 方案4:递归改迭代(最稳妥,从根源消除栈压力)
递归每调用一次,就会往栈压入一层函数帧(局部变量、返回地址)。递归几万层,再大的栈也会爆。
- DFS递归 → 用栈容器std::stack手写迭代版DFS
- 斐波那契递归 → 循环迭代
示例:递归改迭代思想
cpp
//递归版(层数大就爆栈)
void dfs(int x){
if(x>10000) return;
dfs(x+1);
}
//迭代版,使用std::stack,内存在堆,不占用程序栈
#include<stack>
stack<int> st;
st.push(1);
while(!st.empty()){
int x = st.top(); st.pop();
if(x>10000) continue;
st.push(x+1);
}
✅ 方案5:减少单个函数栈占用
- 函数内不要定义大型结构体、大数组
- 大结构体尽量用指针/引用传递,不要值拷贝(值拷贝会在栈生成副本)
cpp
struct Big{ int a[10000]; };
void func(Big b){} // ❌ 值传递,栈复制一份,占用大量栈
void func(Big &b){} // ✅ 引用,只传地址,几乎不占栈