在1G內存的計算機中能否malloc(1.2G)?為什么?
malloc能夠申請的空間大小與物理內存的大小沒有直接關系,僅與程序的虛擬地址空間相關。程序運行時,堆空間只是程序向操作系統申請划出來的一大塊虛擬地址空間。應用程序通過malloc申請空間,得到的是在虛擬地址空間中的地址,之后程序運行所提供的物理內存是由操作系統完成的。
本題要申請空間的大小為 1.2G=2 30 × 1.2 Byte ,轉換為十六進制約為 4CCC CCCC ,這個數值已經超過了 int 類型的表示范圍,但還在 unsigned 的表示范圍。幸運的是 malloc 函數要求的參數為 unsigned 。見下面的示例代碼。
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 char*p; 6 const unsigned k= 1024*1024*1024*1.2; 7 printf("%x\n",k); 8 p= (char *)malloc( k ); 9 if( p!=NULL ) 10 printf("OK"); 11 else 12 printf("error"); 13 return 0; 14 }
【知識拓展】malloc能夠申請的空間到底能達到多大,還真是一個比較復雜的問題。想知道在一台機器上malloc能夠申請的最大空間到底是多少,可以使用下面的程序進行測試。
1 #include <stdio.h> 2 3 #include <stdlib.h> 4 5 unsigned maximum = 1024*1024*1024; 6 7 int main(int argc, char *argv[]) 8 9 { 10 11 unsignedblocksize[] = {1024*1024, 1024, 1}; 12 13 inti, count; 14 15 void* block; 16 17 for(i=0; i<sizeof(blocksize)/sizeof(unsigned); i++ ) 18 19 { for( count = 1; ;count++ ) 20 21 { block = malloc( maximum +blocksize[i]*count ); 22 23 if( block!=NULL ) { 24 25 maximum= maximum + blocksize[i]*count; 26 27 free(block ); 28 29 }else { 30 31 break; 32 33 } 34 } 35 } 36 37 printf("maximummalloc size = %u bytes\n", maximum); 38 39 return0; 40 41 }
