我不确定为什么我的二维数组初始化会导致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 */
答案 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 ) );