qq_33892372 2016-01-30 09:48 采纳率: 100%
浏览 2092
已采纳

关于c语言malloc的用法。。

c语言的malloc语句中动态获取的最大空间和电脑的什么有关?
c语言的malloc语句中动态获取的最大空间和电脑的什么有关?

  • 写回答

6条回答

  • threenewbee 2016-01-30 23:58
    关注

    首先,计算机的物理内存、计算机的寻址能力、计算机的地址空间、malloc申请的值、操作系统进程的地址空间几个概念都是不同的。

    计算机的寻址能力是字长决定的,一台32位的电脑,寻址能力是4GB,注意,这些地址中还有dma bios io等等的保留地址,它留给内存的地址空间大约是3.5GB左右(具体计算机不同)
    计算机的寻址能力决定了计算机物理上能访问的最大内存空间。但是物理内存可能比它大,也可能比它小。你买计算机,会知道内存的大小,2GB 4GB 8GB等等。
    计算机为每个进程划分了独立的虚拟地址空间。对于windows(32bit)来说,2GB以下是用户空间,2GB以上是系统空间。这就决定了一个32bit的进程,只能访问2GB的内存,是不是正好2GB呢?不是,因为堆栈、静态区等等也占用了一些地址,而且堆上的地址也不是连续的,如果碎片很多,会出现有空间没法分配的情况。
    如果你的计算机只安装了1GB的内存,是不是只能访问1GB(或者更少)呢?也不是,因为操作系统会使用页面文件(俗称虚拟内存,此虚拟内存不是虚拟地址空间,而是指拿磁盘作为页面交换空间模拟出来的内存)。
    那么malloc分配了一个很大的空间,是不是一定就报内存溢出/内存不足的错误呢?也不是,因为操作系统分配内存是按照懒惰分配的原则。也就是如果你没有实际访问这些内存,那么光分配,这些虚拟内存地址被分配出去了,但是并没有使用实际的内存,也就是没有分配页。所以malloc能分配的内存比实际上没有使用的物理内存还要大。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题