2011-01-08 52 views
0

如何創建一個大小非常大的數組?那麼我無法創建一個大小爲INT_MAX的數組..如何才能實現這一目標。分配的數組的大小非常大

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#define SIZE 2147483647 

int main() {  
    int *array;  
    unsigned int i; 

    array = malloc(sizeof(int) * SIZE);  
    if(array == NULL) { 
     fprintf(stderr, "Could not allocate that much memory"); 
     return 1; } 

    for(i=0; i<1; i++) { 
     array[0] = 0;  
    }  

    free(array); 
} 
+0

*我無法創建大小爲INT_MAX的數組*這不是您的代碼所做的事。它試圖創建一個sizeof(int)* INT_MAX的數組。 – 2011-01-08 06:22:35

回答

0

您正在創建一個最小4GB大小的數組。你確定你有那麼多的空閒內存嗎?

+2

比空閒內存更重要的是地址空間。如果你的機器每個指針沒有足夠的位來訪問數組的特定索引,那麼你是否有足夠的可用內存並沒有關係(並且虛擬內存無論如何都使得可用內存大部分都是一個爭論點)。 – 2011-01-08 06:04:01

+0

謝謝Zach,你是對的 – 2011-01-08 07:16:53

+0

但是,如果沒有足夠的地址空間,這並不意味着操作系統沒有看到足夠的可用空間。我們的答案不一樣嗎?可能是我應該把「那個可尋址的空閒內存」。 – 2011-01-08 07:25:34

5

您幾乎肯定會遇到平臺限制。如果你只有一個32位的地址空間,那麼4G就是你希望解決的問題。實際上,由於地址空間的一部分會被其他事物佔用,因此它會少得多。

對於64位地址空間,這可能是可能的,但是一旦達到了這種分配級別,您應該問自己是否真的有必要。

解決該問題的一種方法是使用磁盤等內存不足的存儲,並且只將需要的內容帶入內存。

換句話說,將數據結構分割成(例如)1M塊,並一次處理1M塊。

根據數據結構的使用模式,可以使用很多緩存算法來高效地完成此操作。

例如,對於真正的順序訪問,一次可以在內存中有一個塊。對於真正的隨機訪問,您可能希望在緩存場景中同時在內存中包含多個塊 - 每個內存中的結構既存儲1M數據,也存儲內存不足存儲的位置,因此您可以使用LRU算法並回寫髒數據等等。

1

你的第一個問題不是分配本身,而是看似簡單的表達sizeof(int) * SIZE。如果int有4個字節,那麼該操作的結果是0x1FFFFFFFC。這需要33位來表示。如果您的平臺只有32位的size_t類型,則乘法結果將循環顯示(size_t未經簽名),併爲您提供0xFFFFFFFC

如果您剛剛在調用malloc時使用了上面的33位值,您的編譯器可能會告訴您該數字不可表示。

-1

到目前爲止,每個人都試圖回答你的問題,但我想採取另一種方法。根據我的經驗,實際上你很少需要一組你想要分配的類型/大小的數組。在創建這樣一個巨大的結構(解析數組,堆棧,隊列,地圖)時,通常還有其他的方式來做你所需要的。

我很好奇你想用這個數組做什麼。 。 。我敢打賭,如果我們明白你想解決什麼問題,你實際上並不需要它。另一方面,如果這是一項智力活動(例如我可以分配多大),那麼也有辦法回答這些類型的問題。

如果你想玩。 。 。你究竟在努力完成什麼?