我是C ++的初学者。 我试图从控制台读取输入,所以我有以下代码:
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
#define maxn 2006
int A[maxn][maxn];
int main() {
memset(A,0,sizeof(A));
int n = 0,m = 0;
cin >> n >> m;
for(int i = 0; i < n; ++i){
string str; cin >> str;
for(int j =0; j < m; ++j)
A[i][j] = str[j]-'0';
}
return 0;
}
示例输入如下所示
5 7
0101010
1000101
0101010
1010101
0101010
我上面的程序效果很好。
然而,出于学习目的,我什么都没做,只是将2D int数组A的声明移到main函数中,如下所示:
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
#define maxn 2006
int main() {
int A[maxn][maxn];
memset(A,0,sizeof(A));
int n = 0,m = 0;
cin >> n >> m;
for(int i = 0; i < n; ++i){
string str; cin >> str;
for(int j =0; j < m; ++j)
A[i][j] = str[j]-'0';
}
return 0;
}
我重建它并运行,我得到分段错误11.
任何人都知道这里发生了什么?为什么在微妙的变化之后代码会崩溃?
谢谢!
答案 0 :(得分:3)
任何人都知道这里发生了什么?
是:堆栈溢出。
通过移动变量,你使它成为一个本地(堆栈分配)而不是全局(在二进制文件的BSS部分启动时分配)。
变量的大小为16,096,144字节(2006 * 2006 * 4)。堆栈通常是有限的,通常为8MB。在UNIX系统上,在ulimit -s unlimited
之后,您修改的程序可能会再次开始工作。