由于变量范围导致的段故障



我是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。

有人知道这里发生了什么吗?为什么代码在细微更改后会崩溃?

谢谢!

有人知道这里发生了什么吗?

是:堆栈溢出。

通过移动变量,您可以使其成为局部(堆栈分配)而不是全局(在二进制文件的 BSS 部分中启动时分配)。

变量的大小为 16,096,144 字节 (2006 * 2006 * 4)。并且堆栈通常受到限制,通常为 8MB。在 UNIX 系统上,ulimit -s unlimited后,修改后的程序可能会再次开始工作。

相关内容

  • 没有找到相关文章