具有2D阵列的Seg Fault

时间:2014-02-24 10:26:40

标签: c++ arrays segmentation-fault multidimensional-array

我不确定为什么我的二维数组初始化会导致seg错误,所以我有

void viterbi_algorithm(double init[], double A[][26], double B[][2], int obs[], 
                       int mostLikelyStates[]){


   cout << "start" << endl;


   double table1[26][68000];
   double table2[26][68000];

..

如果我将这两张表评论出来,一切都会好的。我要求太多回忆吗?

我运行gdb时的错误

Program received signal SIGSEGV, Segmentation fault.
___chkstk_ms () at /usr/src/debug/gcc-4.8.1-3/libgcc/config/i386/cygwin.S:146
146             orq     $0x0, (%rcx)            /* probe there */

4 个答案:

答案 0 :(得分:1)

double table1[26][68000];
double table2[26][68000];

会超过程序的stack大小。请动态分配。

答案 1 :(得分:1)

您只是耗尽了堆栈空间。您正在堆栈上分配sizeof(double)*2*26*68000个字节。当堆栈空间通常约为2mb时,这超过28mb。

相反,动态分配内存。有几种方法可以做到这一点。最简单的是:

std::unique_ptr<double[][68000]> table1(new double[26][68000]);
std::unique_ptr<double[][68000]> table2(new double[26][68000]);

table1[x][y] = 5.0;
....

答案 2 :(得分:1)

这对堆栈来说太多了。您可以使用new[]delete[]在堆上手动分配数组,但这很乏味且容易出错。我可以建议一个数组矢量吗?

#include <vector>
#include <array>

std::vector<std::array<double, 68000>> table1(26);
std::vector<std::array<double, 68000>> table2(26);

答案 3 :(得分:1)

使用关键字static

定义这些数组
   static double table1[26][68000];
   static double table2[26][68000];

在这种情况下,它们将被分配到静态存储器中。

另一种方法是使用标准容器std::vector。 例如

   std::vector<std::vector<double>> table1( 26, std::vector<double>( 68000 ) );
   std::vector<std::vector<double>> table2( 26, std::vector<double>( 68000 ) );

您还可以使用关键字static

定义它们
   static std::vector<std::vector<double>> table1( 26, std::vector<double>( 68000 ) );
   static std::vector<std::vector<double>> table2( 26, std::vector<double>( 68000 ) );