在1G内存的计算机中能否malloc(1.2G)?为什么?

作者:开点工作室(微信公众号:kaidiancs)
链接:https://www.nowcoder.com/discuss/20610?type=0&order=0&pos=6&page=1
【解答要点】:malloc能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。程序运行时,堆空间只是程序向操作系统申请划出来的一大块虚拟地址空间。应用程序通过malloc申请空间,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。

本题要申请空间的大小为 1.2G=2 30 × 1.2 Byte ,1.2G=(1024*1024*1024)*1.2Byte转换为十六进制约为 4CCC CCCC ,这个数值已经超过了 int 类型的表示范围,但还在 unsigned 的表示范围。幸运的是 malloc 函数要求的参数为 unsigned 。见下面的示例代码。

#include <stdio.h>

#include <stdlib.h>

int main()

{     

      char*p;

       constunsigned k= 1024*1024*1024*1.2;    

       printf("%x\n",k);

       p= (char *)malloc( k );

       if( p!=NULL )

              printf("OK");

       else

              printf("error");

       return0;

}

【知识拓展】malloc能够申请的空间到底能达到多大,还真是一个比较复杂的问题。想知道在一台机器上malloc能够申请的最大空间到底是多少,可以使用下面的程序进行测试。

 

#include <stdio.h>

#include <stdlib.h>

unsigned maximum = 1024*1024*1024;

int main(int argc, char *argv[])

{

       unsignedblocksize[] = {1024*1024, 1024, 1};

       inti, count;

       void* block;

       for(i=0; i<sizeof(blocksize)/sizeof(unsigned); i++ )

       {     for( count = 1; ;count++ )

              {     block = malloc( maximum +blocksize[i]*count );

                     if( block!=NULL ) {

                            maximum= maximum + blocksize[i]*count;

                            free(block );

                     }else {

                            break;

                     }

              }

       }

       printf("maximummalloc size = %u bytes\n", maximum);

       return0;

}

在当前正在使用的Windows环境中,可申请的最大空间超过1.9G。实际上,具体的数值会受到操作系统版本、程序本身的大小、用到的动态/共享库数量、大小、程序栈数量、大小等的影响,甚至每次运行的结果都可能存在差异,因为有些操作系统使用了一种叫做随机地址分布的技术,使得进程的堆空间变小。感兴趣的读者可以去研究操作系统中的相关内容。

 

有了以上与malloc相关的知识后,对于下面问题的答案自然就容易理解了。

 

以下关于malloc及相关概念的说法中,错误的是(    )。

 

A.内存泄露一般是指程序申请了一块内存,使用完后没有技术将这块内存释放,从而导致程序占用大量内存

 

B.无法通过malloc( size_t ) 函数调用申请超过该机器物理内存大小的内存块

 

C.无法通过内存释放函数 free( void * ) 直接将某块已经用完的物理内存直接还给操作系统

 

D.可以通过内存分配函数 malloc( size_t ) 直接申请物理内存

 

选项A和C的结论是正确的,选项B和D的概念是错误的。应用程序不能直接申请物理内存,malloc申请的是虚拟空间。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值