【總結】malloc最多能分配多大的內存空間?

malloc的全稱是memory allocation,中文叫動態內存分配,用於申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
void* 類型表示未確定類型的指針。C,C++規定,void* 類型可以通過類型轉換強制轉換爲任何其它類型的指針。一般需和free函數配對使用。但是,malloc最多能分配多大的空間呢?

下面給出一段代碼:

//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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章