下面給出一段代碼:
//malloc最多能分配多大的空間?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int count = 0;
while (malloc(1 << 20))//一次性分配1M的內存空間
{
count++;
}
printf("%d\n", count);
return 0;
}
這段代碼在linux的環境下的結果大約爲3G;但是這個結果收到系統環境的影響。
下面這段代碼來自《程序員的自我修養》,
//《程序員的自我修養》
#include <stdio.h>
#include <stdlib.h>
int count = 0;
void *p = NULL;
int main(int argc, char *argv[])
{
int blocksize[4] = { 1024 * 1024 * 1024, 1024 * 1024, 1024, 1 };
int i, j;
for (i = 0; i<4; ++i)
{
for (j = 1; ; ++j)
{
if (NULL == (p = malloc(count + blocksize[i])))
{
printf("%d\n", j); break;
}
count += blocksize[i];
free(p);
}
}
printf("mallocmaxmemory:%d\n", count);
return 0;
}
下面是來自知乎的講解:
地址空間限制是有的,但是malloc通常情況下申請到的空間達不到地址空間上限。內存碎片會影響到你“一次”申請到的最大內存空間。比如你有10M空間,申請兩次2M,一次1M,一次5M沒有問題。但如果你申請兩次2M,一次4M,一次1M,釋放4M,那麼剩下的空間雖然夠5M,但是由於已經不是連續的內存區域,malloc也會失敗。系統也會限制你的程序使用malloc申請到的最大內存。Windows下32位程序如果單純看地址空間能有4G左右的內存可用,不過實際上系統會把其中2G的地址留給內核使用,所以你的程序最大能用2G的內存。除去其他開銷,你能用malloc申請到的內存只有1.9G左右。
作者:Cascade
鏈接:https://www.zhihu.com/question/20836462/answer/16341442