分段错误(核心转储) - 无法访问的计数器值

Posted

技术标签:

【中文标题】分段错误(核心转储) - 无法访问的计数器值【英文标题】:Segmentation fault (core dumped) - unreachable counter value 【发布时间】:2013-11-11 16:53:13 【问题描述】:

我需要使用二维布尔表来帮助我解决动态规划方法的问题。不幸的是,我遇到了一个问题,我想打印计数结果。我之前没有用 c++ 编写太多代码,所以我不明白这段代码有什么问题,特别是因为我在这里没有使用任何定制的结构、类或指针,并且我仔细检查了迭代器中的数组边界是否正确。

这是我的问题的一个简单代码示例:

const short int N=1001;
const short int M=10001;

int main() 
    bool tab[N][M];
    for (int i=0;i<N;i++)
        for (int j=0;j<M;j++)
            tab[i][j]=false;

    int foo=0;
    for (int i=0;i<N;i++)
        for (int j=0;j<M;j++)
            if (!tab[i][j])
                foo++;

    cout << foo << endl;

    return 0;

为什么尝试打印 foo 值会出现分段错误错误?该变量在我尝试在 for 函数中增加它之前被初始化。当我删除 cout 行时,一切正常,程序确实完成了工作(尽管我看不到结果)。提前感谢您帮助我解决这个(很可能)简单的问题。

【问题讨论】:

为什么省略了大括号? 你必须得到 int 溢出。将 foo 更改为 unsigned long long int 很可能是堆栈溢出 - 数组占用(至少)10MB,这对于堆栈来说可能太大了。如果是这样,那么动态分配是最简单的解决方案。 int 溢出会导致值换行,因此您会得到无意义的输出。堆栈溢出似乎更有希望。尝试降低 M 和 N 这不是未定义值溢出问题。这是堆栈溢出。 main() 的激活记录需要 9.55MB 的空间,远远超过我见过的任何默认运行时提供的空间。 SO, such as this one 上有 几十个 重复问题。而且你不需要 either 循环来重现这个。 【参考方案1】:

存在分段错误错误,因为您尝试存储的数字对于整数变量来说太大了。

当它可以存储的最大值为 32767 (http://www.cplusplus.com/reference/climits/) 时,您尝试将 10011001 (1001 * 10001) 存储在整数变量中

【讨论】:

整数溢出不会导致分段错误——这是由访问无效内存引起的。此外,int 在大多数现代平台上都是 32 位,尽管您说得对,不能保证它大于 16。

以上是关于分段错误(核心转储) - 无法访问的计数器值的主要内容,如果未能解决你的问题,请参考以下文章

无法从 cpp 代码运行 image_transport:“分段错误(核心转储)”

C++ 代码的分段错误(核心转储)

命令行参数分段错误(核心转储)

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

识别导致分段错误(核心转储)的错误

分段错误:从文件访问 csv 记录时核心转储