在main之前的C ++程序中出现奇怪的分段错误

时间:2011-12-29 11:20:16

标签: c++ linux segmentation-fault

在一些内存测试中,我做了以下程序的段错误:

#include <string>
#include <iostream>
using namespace std;

int main()
{
    cout << "Beginning Test" << endl;
    const int N = 2000000;  
    string sArray[N];
    return 0;
}

由于我在打印“Beginning Test”之前得到了段错误,我在GDB中运行它并检查了回溯,我得到的唯一的东西是:

  

编程接收信号SIGSEGV,分段故障   main.cxx中main()中的0x00000000004008c5:11   11弦sArray [N];
  (gdb)bt
   Main.cxx:11

中main()中的#0 0x00000000004008c5

对我来说最奇怪的是,如果我将N设置为1000000(1M)而不是2000000(2M),我就不会得到段错误

可能出现问题的任何线索?

我正在使用Linux Red-Hat 2.6.18和g ++(GCC)4.1.2。

谢谢!

5 个答案:

答案 0 :(得分:15)

堆栈溢出......

故意它,不是吗?

答案 1 :(得分:6)

您正在溢出堆栈,由于某种原因,输出不会被刷新。 2M string s是相当多的记忆。尝试使用heap代替stack

最重要的是,使用vector代替数组并停止担心手动分配。

答案 2 :(得分:1)

string sArray[N];

可能耗尽所有堆栈内存导致它发生段错误。

答案 3 :(得分:1)

sArray是主方法的本地方法,因此它将在堆栈上分配。但堆栈不足以容纳2000000个元素,因此它会爆炸。

现在,编译器尝试在函数的最开始分配sArray(概念上,在'{',),这就是为什么在输出“Beginning Test”之前发生堆栈溢出的原因。

答案 4 :(得分:0)

你刚刚堆栈溢出。 如果要在堆栈上分配大型数组,则需要更改堆栈大小。 在这里寻找指令Increase stack size in Linux with setrlimit