0

当我运行它时,继续分配内存与 cnt 超过数千似乎没有问题。我不明白为什么——我不应该在某个时候得到一个 NULL 吗?谢谢!

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


int main(void)
{
    long C = pow(10, 9);
    int cnt = 0;
    int conversion = 8 * 1024 * 1024;
    int *p;
    while (1)
    {
        p = (int *)malloc(C * sizeof(int));
        if (p != NULL)
            cnt++;
        else break;
        if (cnt % 10 == 0)
            printf("number of successful malloc is %d with %ld Mb\n", cnt, cnt * C / conversion);
    }

    return 0;
}
4

2 回答 2

2

你在Linux上运行这个吗?Linux 有一个非常令人惊讶的特性,称为过度使用。当您调用 malloc() 时,它实际上并没有分配内存,而是在您实际使用该内存时。malloc() 将很高兴地让您根据自己的意愿分配尽可能多的内存,而永远不会返回 NULL 指针。

只有当您真正访问内存时,Linux 才会认真对待您并出去寻找空闲内存给您。当然,实际上可能没有足够的内存来满足它给你的程序的承诺。你说“给我 8GB”,malloc() 说“当然”。然后你尝试写你的指针,Linux 说:“哎呀!我撒谎了。我要不要直接杀死进程(可能是你的),直到释放足够的内存?”

于 2013-05-17T02:52:29.117 回答
0

您正在分配虚拟内存。在 64 位操作系统上,虚拟内存几乎无限供应。

于 2013-05-17T02:48:36.137 回答