2010-10-15 142 views
17

我試圖創建一個長度爲UInt32.MaxValuebyte的數組。該陣列基本上是一個小的(ISH)的內存數據庫:字節[]的最大長度?

byte[] countryCodes = new byte[UInt32.MaxValue]; 

在我的機器,但是,在運行時,我得到一個System.OverflowException「算術運算導致溢出」。

這是怎麼回事?我是否需要使用unsafe區塊和malloc?我將如何在C#中做到這一點?

+4

我不知道有這麼多的國家! – James 2015-06-10 21:47:45

回答

24

System.Array的當前實現對其所有內部計數器等使用Int32,所以元素的理論最大數量爲Int32.MaxValue

還有一個由Microsoft CLR施加的每個對象最大2GB的限制。

很好的討論和解決辦法在這裏...

和一些相關,不-相當重複的,問題和答案在這裏...

1

我不會這樣做的第一個地方。爲什麼你想爲這個內存數據庫設置所有內存?難道你不想要一個數據結構的大小隨着你的增長而增加(例如List<int>)?或者(如果喜歡)使用內存數據庫,如sqlite

7

.NET 4.5一個字節數組的最大可實例化長度爲:2147483591,或56小於int.MaxValue。發現通過:

for (int i = int.MaxValue; i > 0; i--) 
{ 
    try 
    { 
     byte[] b = new byte[i]; 
     Console.Out.WriteLine("MaxValue: " + i); 
     Environment.Exit(0); 
    } 
    catch (Exception ignored) 
    {} 
}