2014-02-24 63 views
1

我不知道爲什麼我的二維數組初始化導致賽格故障,所以我有賽格故障與二維數組

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

儘量減少你的內存需求。即用8000替換68000並檢查它 –

回答

1

使用關鍵字靜態

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)); 
+0

這個技巧的作品。 – Jack

+0

你真的應該在這裏解釋'static'的含義。這不是微不足道的。這意味着應用程序將永遠消耗額外的28MB,即使它沒有被使用。它也使得該功能不適用於平行運行或重新運行。 – tenfour

+0

@ tenfour好吧,如果你願意的話,你可以返回使用棧中的數組。:) –

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

將超過stack大小的程序。請動態分配它。

+0

如何動態分配它? – Jack

+0

'新雙[26] [68000]' – tenfour

1

你只是用完了堆棧空間。您正在堆棧上分配sizeof(double)*2*26*68000字節。這是超過28mb,當堆棧空間通常在2mb左右。

而是動態分配內存。有幾種方法可以做到這一點。最簡單的是:

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; 
.... 
1

這是太多的內存堆棧。您可以在堆上手動分配數組new[]delete[],但這很乏味且容易出錯。我可以建議一個數組的矢量?

#include <vector> 
#include <array> 

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