嵌入式100題(018):在1G內存的計算機中能否malloc(1.2G)?為什么?


在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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM