2011-02-16 164 views
0

我在64位Ubuntu盒子上運行以下代碼,並使用18 GB的RAM,正如你所看到的,當我嘗試分配2^31時,對Malloc的調用失敗字節。我不知道爲什麼會發生這種情況,或者如何解決它(我已經嘗試過編譯器標誌和calloc())。我想知道是否有人能向我解釋爲什麼我無法在64位盒子上分配更多空間,以及我如何解決這個問題。Malloc在64位Ubuntu盒子上失敗

#include <stdio.h> 
#include <stdlib.h> 
//#include "svm_model_matlab.h" 
//include "svm.h" 
#include <math.h> 


struct svm_node 
{ 
     int index; 
     double value; 
}; 


//#define Malloc(type,n) (type *)calloc(n,sizeof(type)) 
#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) 

int main() 
{ 

     int i; 
     for(i =25; i< 35; ++i) 
     { 
       printf("2^%d %d \n", i,(long int) pow(2,i)); 
       svm_node* x_space = Malloc(struct svm_node,pow(2,i)); 
       printf("the address is %x\n", x_space); 
       free(x_space); 
     } 


     return 0; 
} 

輸出:

2^25 33554432 
the address is 8513e010 
2^26 67108864 
the address is 6513e010 
2^27 134217728 
the address is 2513e010 
2^28 268435456 
the address is a513e010 
2^29 536870912 
the address is a513e010 
2^30 1073741824 
the address is 0 
2^31 -2147483648 
the address is 0 
2^32 0 
the address is 0 
2^33 0 
the address is 0 
2^34 0 
the address is 0 

更新:

我發現這個問題我是有:我目前正在運行我的代碼在EC2上一個64位的Ubuntu Linux發行版,默認的Linux EC2上的盒子有0個交換空間。這導致我的進程在請求的任何內存量超過物理RAM的時候會發生故障,因爲它無法進行分頁。在創建交換文件後,我的問題就消失了。

感謝您的幫助

+0

printf(「%d」,sizeof(svm_node))並告訴我們結果 – 2011-02-16 03:51:23

+0

sizeof(svm_node):16 – josephmisiti 2011-02-16 13:41:14

回答

4

pow()是計算2.使用1 << i,而不是權力一個可怕的方式。

然後,選擇一個足夠大的數據類型來容納您請求的大小。現在它溢出的大小爲int,因此試圖分配負數字節。這顯然不起作用。

我懷疑malloc(1ULL << 31)會在您的系統上成功,沒有任何問題。

接下來,你分配遠遠超過你的問題中提到的2 字節,你實際上是試圖分配2 * sizeof (svm_node),或約2 我+ 4。失敗的分配與i=30,大約爲16GB,這可能會比你的免費RAM多。

最後,您在打印指針時會獲得32位值。改爲嘗試printf("%p", x_space);。如果仍然爲您提供32位值,請嘗試使用64位編譯器。