2009-06-16 58 views
0

假設我有一個大小爲78719476736字節的數組。請注意,這個數組是在我的C代碼中使用malloc動態分配的。假設malloc在分配這麼多內存之後返回一個有效的指針。該數組的大小大於UINT_MAX(4294967295),即無符號整數(32位)的最大極限。在C中訪問大於UINT_MAX * 4大小的內存?

假設我的代碼看起來像下面的例子。

int *buf; 
buf = (int*)malloc(78719476736); 

這裏78719476736大於4 * UINT_MAX。

現在,如果我必須引用buf的所有元素,那麼因爲buf是int *,它將是32位,所以它將無法處理所有使用malloc分配的內存元素(78719476736字節)。

我的問題是不應該改變上面的代碼來使buf長long(64位變量),因爲只有long long變量才能夠解決我分配的大內存。

已更改的代碼例如

unsigned long long int buf; 
buf = (unsigned long long int*)malloc(78719476736); 

事實上,我認爲,可變的buf不應該是一個指針任何更多的任何指針將是32位寬的,因此它不會能夠訪問78719476736個字節。

所以它應該是一個普通的無符號long long int,我必須將malloc返回指針值轉換爲一個無符號long long int,如上面更改後的代碼所示,並使用buf訪問所有分配的元素。

我在上面的假設中正確嗎?

我是不是迷惑/錯過了什麼?

編輯:如果有幫助,

我工作的一個桌面上的Intel Core 2 Duo處理器(64位CPU),其具有的WinXP。因此,CPU明智地訪問超過4 GB的地址空間應該不成問題。什麼其他所有組件應爲64位的支持啓用,即

一)如何啓用64位編譯器的支持,而編譯(我使用Visual Studio 2005專業版)

灣)操作系統支持對於64位 - 我正在使用Windows XP Professional。

謝謝。

-AD。

+0

請告訴我你寫這樣的挫折感,我從來沒有在不經意間使你的malloc 73GB我的服務器上... – Eric 2009-06-16 12:52:42

回答

7
  1. 您需要64個操作系統
  2. 的malloc臨危size_t型的參數是64位在64位平臺
  3. 而最重要的是:你prorbably應該想:我需要分配更多的則4G的記憶?
1

要解決超過4GB的內存,您需要一些選擇內存的機制。因此,您需要將您的應用程序編譯爲64位,然後所有指針都將爲64位寬。

訪問超過4GB內存的唯一方法是使用額外的地址/內存選擇器機制,就像您在真實模式DOS時段使用段和偏移量混亂一樣。這當然取決於你的處理器架構。

1

如果您在64位操作系統上運行軟件並使用64位編譯器設置,則所有指針都將爲64位。無需特別聲明。

3

一個int*是一個指針類型。如果你在一個可以分配78719476736字節的系統上,它可能至少有64位地址,即sizeof(int*) >= 8。指針大小與sizeof(int)是無關的。

5

我認爲你對指針是什麼感到困惑。至少在通用系統上,指針的大小(不同值的數量,即不同地址的數量)與類型無關!

int *a; 
short *b; 
double *c; 

a,b和c是指向不同的類型,但它們都具有相同的尺寸(4個字節的32位的系統上,例如)。與32位相比,這正是64位系統的要點:能夠從指針處理超過2個** 32個位置。另外,一個32位的CPU不能在硬件中尋址多於4Gb [1],並且相應的虛擬地址空間通常也被限制爲32位。因此,將8Gb的內存分配到內存中是不太可能的。

[1]這並非完全正確 - 例如,英特爾CPU具有擴展功能,因此32位CPU可以使用「擴展」地址。