2009-05-26 1217 views
1

我在使用Microsoft Visual Studio-2005編譯器處理C代碼時遇到了一個問題。編譯錯誤:無法分配一個常量大小爲0的數組。爲什麼我得到這個?

我試圖靜態地宣佈一個大的緩衝區爲:

int gbl_data[4096*4096*256]; 

編輯:這個宣言是在頭文件中的全局變量。

這是給編譯錯誤說 - 「不能分配一個恆定大小的數組0」。

意思是4096X4096X256的尺寸比MAX_INT_LIMIT尺寸(2^31)大得多,可能會環繞並變成-ve左右。但是,它應該給出「負下標」的錯誤。

我試着將常量鑄造爲4096UL x 4096UL x 256UL,仍然是編譯錯誤。

這個錯誤的原因是什麼?

是因爲物理內存大小不足以分配這個大尺寸緩衝區或什麼?

它是什麼修復?

謝謝你。

-GM。

+0

gbl_data的一個實例的大小是多少? – sharptooth 2009-05-26 11:55:30

+0

它是一個整數數組。 gbl_data只是數組名稱:) – jalf 2009-05-26 12:00:30

回答

9

數組大小不是int,它是一個unsigned int。一個unsigned int有一個4294967295最大值你有最後一次,因此它繞回到0

鑄造常量,多頭不會改變任何東西,因爲多頭的在大多數32位整數平臺。

您可以嘗試用很長的時間,但現在我們遇到了另一個小問題。

您試圖分配40億個整數。 32位CPU具有40億的存儲空間字節。您試圖分配可能存在的最大理論內存量的4倍。 (16GB)

所以回到繪圖板。找出你爲什麼試圖做到這一點,以及你可以做什麼。

0

您試圖靜態分配2^32(或32位系統上的地址空間的4倍)數組。編譯器似乎截斷了4096 * 4096 * 256(這是我的頭頂,0x10000)到一個32位值。

根據您的平臺,無符號long可能也是32位,也是截斷。

我建議你確保你正在編譯64位平臺(如果這就是你想要的),或者改變算法來動態分配內存(顯然不會超過地址空間),或者鍋與磁盤上的文件。

相關問題