分段错误 chkstk_ms C++

Posted

技术标签:

【中文标题】分段错误 chkstk_ms C++【英文标题】:Segmentation Fault chkstk_ms C++ 【发布时间】:2016-08-09 05:25:42 【问题描述】:

我需要有关以下计数排序实现的帮助。是因为 x 的值可能太大了吗?我遇到分段错误。这就是 gdb 所说的:

Program received signal SIGSEGV, Segmentation fault.
___chkstk_ms () at /usr/src/debug/gcc-5.4.0- 1/libgcc/config/i386/cygwin.S:146
146     /usr/src/debug/gcc-5.4.0-1/libgcc/config/i386/cygwin.S: No such file or directory.

这里是代码sn-p,

void radix_sort::sort_array(int array[], int n)

    int arrayB[n];

    auto k = *std::max_element(&array[0], &array[n - 1]);
    auto m = *std::min_element(&array[0], &array[n - 1]);

    long int x = k - m + 1;
    int arrayC[x];

    for (auto i = 0; i < n; i++)
        arrayC[array[i] - m]++;

    for (long int i = 1; i < x; i++)
        arrayC[i] = arrayC[i] + arrayC[i - 1];

    for (auto i = n - 1; i >= 0; i--)
    
        arrayB[arrayC[array[i] - m] - 1] = array[i];
        arrayC[array[i] - m]--;
    

    for (int i = 0; i < n; i++)
        array[i] = arrayB[i];

【问题讨论】:

int arrayB[n]; 是非标准 C++,如果 n 足够大,在 GCC 4 和 5 实现中很容易导致堆栈溢出。可能不是您的问题,但值得关注。 int arrayC[x]; 也一样。搜索关键字:“可变长度数组”以获取更多信息。 __chkstk_ms 的工作是在数组无法放入堆栈时有意生成段错误。所以是的,n 太大了。如果不能限制其值,则必须使用 new[] 和 delete[] 运算符。 我尝试使用 new[] 和 delete[] 运算符。它不再是段错误。 gdb 现在说问题出在这一行 int arrayC[x];我知道 x 可以很大。考虑如果 k = 20 亿且 m = -20 亿,则 x = 40 亿。我应该使用什么来确保它适用于这个范围? 【参考方案1】:

arrayC[array[i] - m]++;

此时代码中没有分配arrayC 的元素,因此增加了一个未知数。这可能会爆炸

arrayB[arrayC[array[i] - m] - 1] = array[i];

几行之后,因为arrayC[array[i] - m] 可能是负数或几十亿,并且超出了我们所知的范围。

【讨论】:

您建议如何解决? 我的首选是将可变长度数组替换为std::vectorstd::vector&lt;int&gt; arrayC(x); 将使 arrayC 符合标准并自动将所有元素初始化为 0。如果 std::vector 不在表中(并且由于某种原因可变长度数组不是),int arrayC[n] = 0;。否则std::fill 或类似的。 使用 int arrayC[x] = 0; 我仍然遇到相同的段错误我有另一个带有向量的版本,这里没有任何输出:***.com/questions/38840961/counting-sort-c11

以上是关于分段错误 chkstk_ms C++的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:在 C++ 中弹出向量时出现 11

指针数组 C++ 的分段错误

mingw 构建错误:未定义对 `__chkstk_ms' 的引用

C++ 分段错误 OpenCV

在 C++ 中使用向量时出现分段错误

带有向量和字符串的 C++ 分段错误