当我运行这个程序时,它似乎没有问题,继续分配内存,使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 Mbn", cnt, cnt * C / conversion);
}
return 0;
}
你是在Linux上运行这个吗?Linux有一个非常令人惊讶的特性,即过度提交。当您调用malloc()时,它实际上并不分配内存,而是当您实际使用时分配内存。malloc()将很高兴地让您分配尽可能多的内存,永远不会返回NULL指针。
只有当你真正访问内存时,Linux才会认真对待你,并为你寻找空闲的内存。当然,实际上可能没有足够的内存来满足它给程序的承诺。你说,"给我8GB",malloc()说,"当然"。然后你试着写指针,Linux说,"哎呀!我说谎了。如果我只是杀死进程(可能是您的进程),直到我释放足够的内存?"
您正在分配虚拟内存。在64位操作系统上,虚拟内存几乎是无限的。