2012-07-19 55 views
1

other question我問如何編譯一個具有大量數據的向量,因爲我想要一個帶有107776條目字典的向量,而且我無法編譯它。訪問一個巨大的數組時,C++程序凍結

我解決這得益於this answer的代碼:

char const * const dict[] = {"aaron",...}; 

但現在的問題是,當我試圖訪問一個條目...

cout<<dict[431104]<<endl; 

...程序凍結而Windows想關閉它。

爲什麼發生?我該如何解決它?

編輯:對不起,這是我的錯。正如tbroberg和Seth Carnegie在this answer中注意到的那樣,錯誤在於我認爲sizeof(dict)是數組長度(而不是sizeof(dict)/sizeof(*dict))。 因此,431104遠遠超出了數組的範圍(其長度爲107776)。

+2

你需要做的是在其他問題中的評論建議,把它放在一個文件中並解析它。你不能在堆棧上存儲那麼多東西。 – 2012-07-19 18:49:29

+1

@up true。順便說一下,我會建議你學習如何使用調試器。這真的是有用的工具:) – Blood 2012-07-19 18:50:06

+0

是dict []本地還是全局變量? – PiotrNycz 2012-07-19 18:54:09

回答

3

您正在堆棧上分配107776 char* s,這可能足以導致您的計算機發生堆棧溢出。您可以嘗試在堆中分配的char* S和使用初始化器列表:

const char** dict = new const char*[107776] {"aaron",...}; 

// ... use dict 

delete[] dict; 

這應該解決這個問題(如果問題是堆棧大小,我認爲這是)。

此外,我剛剛注意到,您的索引431104遠遠超出了數組的範圍,它的大小爲107776(我誤解爲100萬之前)。你確定你的問題不只是超出界限?

+1

Ups!看起來你是對的,431104遠遠超出了陣列的範圍。 我想得到dict的長度(我知道它是107776,因爲我用JavaScript計算),但dict.size()沒有工作,所以我做了sizeof(dict)。 感謝你的回答,我記得sizeof說的是數組的字節大小(這不是我想要的)。 如果我用107776替換sizeof(dict),它似乎有效! – Oriol 2012-07-19 19:38:48

+0

@Oriol你可以通過執行sizeof(dict)/ sizeof(* dict)'來計算元素中數組的大小。請注意,如果您將該數字用作索引,則該數字超過數組的末尾。 – 2012-07-19 20:04:28

0

嘗試把staticconst前:

static const char *const dict [] = { "a...", ... 

現在,它在初始化數據段進行分配。根據你的平臺和編譯器/鏈接器的能力,它可能正常工作。

操作系統通常會處理這些數據的緩存/交換,所以如果數據真的是不可變的,那麼這是首選的方法。