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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于变量范围导致的段错误相关的知识,希望对你有一定的参考价值。

我是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之后,您修改的程序可能会再次开始工作。

以上是关于由于变量范围导致的段错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL 多 GPU 积分 - 将全局大小从 32 更改为 64 时的段错误

OpenCV 分配导致 std::thread::join 中的段错误

文件读取期间的段错误

Struct 上下文中未使用 printf 时的段错误

QOpenGLVertexArrayObject 导致多个 VBO 的段错误?

成功的取消引用似乎会导致潜在的段错误