当前位置: 首页 > 面试题库 >

为什么malloc没有“用完”计算机上的内存?

白越
2023-03-14
问题内容

因此,我有一个分配256 MB内存的程序,在用户按下ENTER键后,它将释放内存并终止。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *p, s[2];

    p = malloc(256 * 1024 * 1024);
    if ( p == NULL) 
        exit(1);

    printf("Allocated"); 
    fgets(s, 2, stdin);
    free(p);
    return 0;
}

我多次运行了该程序并将它们分别作为背景,直到不再有足够的内存可以分配。但是,那永远不会发生。我运行了linux
top命令,即使在多次运行该程序之后,可用内存也不会减少多达256 MB。

但是,另一方面,如果我使用calloc而不是malloc则存在巨大差异:

p = calloc(256 * 1024 * 1024, 1);

现在,如果我运行该程序并使其后台运行,然后重复执行,则每次运行它时,可用内存都会减少256
MB。为什么是这样?为什么不malloc导致可用的可用内存改变,但是calloc为什么呢?


问题答案:

malloc() 使用内存。它分配它。

分配内存后,通过分配一些数据来使用它。

size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
  memset(p, 123, Size);
}

某些平台实现malloc()的方式是,直到访问该字节(或更可能是字节组或字节的“页”中的一个字节)时才发生物理上的内存消耗。

calloc()可能会也可能不会真正 使用 内存。系统可以 大量内存 _映射_到相同的物理归零内存,至少直到数据变得有趣为止。



 类似资料:
  • 我多次运行这个程序,并对其中的每一个进行后台处理,直到不再有足够的内存可以分配。然而,这种情况从未发生过。我运行了一个linux命令,即使多次运行这个程序,空闲内存也从未减少过256 MB。 但是,另一方面,如果我使用而不是,那么就有一个巨大的区别:

  • 问题内容: import numpy as np 当我在装有macOS的8GB内存MacBook上运行上述代码时,不会发生任何错误。但是,如果在装有Windows 10的16GB内存PC,12GB内存的Ubuntu笔记本电脑甚至是128GB内存的Linux超级计算机上运行相同的代码,Python解释器将引发MemoryError。所有测试环境都安装了64位Python 3.6或3.7。 问题答案:

  • 我面临的一些问题,没有收到通知在一些电话。我也不接受GCM的意图。这是我打电话给GCM注册时的日志。在像Nexus和Moto这样的手机上,它运行得非常好。但在Lava和Karbonn这样的低端手机上,我就面临着这个问题。 D/PowerManagerService(649):AcquireWakeLockInternal:lock=1114432392,Flags=0x1,tag=“gcm_con

  • 1. 为什么计算机用二进制计数 人类的计数方式通常是“逢十进一”,称为十进制(Decimal),大概因为人有十个手指,所以十进制是最自然的计数方式,很多民族的语言文字中都有十个数字,而阿拉伯数字0~9是目前最广泛采用的。 计算机是用数字电路搭成的,数字电路中只有1和0两种状态,或者可以说计算机只有两个手指,所以对计算机来说二进制(Binary)是最自然的计数方式。根据“逢二进一”的原则,十进制的1

  • 计算机(computer)是能以人的几百万甚至几十亿倍速度进行计算并作出逻辑判断的设备。例如今天的许多个人计算机每秒钟可以进行几亿次加法运算。操作台式计算器的人要几十年才能算出的数值,强大的个人计算机只要一秒钟即可计算完毕(注意:你怎么知道这个人加对了没有?你怎么知道计算机做得是否正确?)。 如今最快的超级计算机(supercomputer)每秒钟可以进行几干亿次加法运算,是成百上千的人花一整年时

  • 现在我有一个,那么有没有方法或类来计算这个字符串表达式并直接返回给我结果呢? 提前道谢!