2009-12-12 108 views
3

我有一個程序需要在C中聲明一個大小爲1000000的大整數數組(使用GNU GCC編譯器)。我試圖用兩種不同的方式聲明數組。主函數內部大量內存的靜態分配

兩種可能的代碼是:

#include <stdio.h> 
int arr[1000000]; 
int main() 
{ 
    return 0; 
} 

#include <stdio.h> 
int main() 
{ 
    int arr[1000000]; 
    return 0; 
} 

後者版本運行期間掛起。可能的原因是什麼?

非常感謝!

回答

9

第二個版本在堆棧上分配,對於任何給定的進程,其大小可能會限制在您的系統上。第一個分配給進程的數據段,其大小不受限制(至少對於這些數量級的分配大小)

this SO answer您可以瞭解如何檢查堆棧分配限制各種平臺,如Linux和Windows。

ulimit -a 
+0

如果需要,您通常可以將堆棧大小上移到gcc編譯器選項。你應該可以讓gcc在編譯過程中標記堆棧溢出。 – Paul 2009-12-12 06:18:51

+0

@Paul當然,由於單獨編譯,大多數堆棧溢出只能在鏈接時標記出來? – 2009-12-12 11:22:50

+0

@Pascal:只有一些...遞歸使其不確定 - 你永遠不知道運行時有多深 – 2009-12-12 13:39:11

1

既然你用這個詞靜態的稱號,這是一個奇蹟,它沒有發生實際聲明變量static:如果你是在Linux上,因爲它是那麼簡單。

int main() 
{ 
    static int arr[1000000]; 
    return 0; 
} 

您也可以使用動態分配。

+0

不知道爲什麼它被downvoted。我把它撞回去了。 – 2009-12-12 23:49:05