分段错误:堆栈溢出

RSF*_*on7 4 c++ stack-overflow cout segmentation-fault

以下内容发生在linux 2.6.32-220.7.1.el6.x86_64g++ 4.4.6.

以下代码:

#include <iostream>
#include <cstdlib>

int PROB_SIZE   = 10000000;
using namespace std;

int main(int argc, char *argv[])    {

    unsigned int numbers[PROB_SIZE];
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下SIGSEGV :( gdb)运行启动程序:/ home/cpd20202/sorting/error

Program received signal SIGSEGV, Segmentation fault.
0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13
13      cout << "Generating " << PROB_SIZE << " random numbers... " << flush;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6_2.5.x86_64 libgcc-4.4.6-3.el6.x86_64 libstdc++-4.4.6-3.el6.x86_64
(gdb) where
#0  0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13
Run Code Online (Sandbox Code Playgroud)

我真的没有想法.

zne*_*eak 8

这是因为你的数组大于堆栈的大小.因此,当程序在函数调用期间尝试推送新内容时,程序会崩溃.

您获得的错误在概念上与堆栈溢出相同,除非它是由局部变量非常大而不是嵌套太多函数调用引起的.

堆栈是一小块内存,供管理和局部变量使用.它从来都不是很大,最多只有几兆字节.这就是为什么你需要一个动态分配来摆脱你的问题.大多数动态分配将利用堆,这通常仅受物理内存的限制.

您需要在堆上分配数组.为此,您有几个选项,其中最简单的可能是使用a std::vector<int>.它们的行为与普通阵列大致相同,并且它们的存储是自动管理的,因此这应该不是问题.

#include <vector>
#include <iostream>

int PROB_SIZE   = 10000000;
using namespace std;

int main()
{
    vector<int> numbers(PROB_SIZE);
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 5

您的"数字"数组正在堆栈中分配,可能太大了.您需要动态分配数组.

  • @ RSFalcon7,这是堆大小.堆栈要小得多.因此,您需要在堆而不是堆栈上分配内存. (2认同)