码迷,mamicode.com
首页 > 其他好文 > 详细

嵌入式100题(018):在1G内存的计算机中能否malloc(1.2G)?为什么?

时间:2021-02-25 12:20:47      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:for   十六   count   col   main   erro   lang   sizeof   style   

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

 

嵌入式100题(018):在1G内存的计算机中能否malloc(1.2G)?为什么?

标签:for   十六   count   col   main   erro   lang   sizeof   style   

原文地址:https://www.cnblogs.com/swk0918/p/14444979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!