c++ - 由于变量范围导致的段错误

标签 c++ input scope segmentation-fault

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

有人知道这是怎么回事吗?为什么代码在细微的改变之后就崩溃了?

谢谢!

最佳答案

Anyone know what's going on here?

是:堆栈溢出。

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

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

关于c++ - 由于变量范围导致的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48088473/

相关文章:

具有相同数据结构的 C++ 类

无故读取文件时跳过 C++ 行

c - 如何使用 scanf() 扫描其中包含空格的字符串?

javascript - `#` 的一致 keyCode

c++ - 最简单的 QT TCP 服务器

javascript - 如何使用 jquery 隐藏表行具有未经检查的输入

Javascript:如何修改函数内的全局变量?

scala - 如何在 Scala 中没有早期初始化程序的情况下为父类(super class)构造函数创建参数

c - 返回指针的函数

c++ - CUDA:跨不同内核使用共享内存