C語言申請記憶體時堆疊大小限制

2021-08-16 05:49:43 字數 1731 閱讀 8652

一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下:

開闢一片記憶體空間有2種方式,第一種:int a;第二種malloc,那麼在linux下,這兩種方式可以開闢多大的記憶體空間呢?下面依次進行實驗:

第一種方式:使用malloc申請記憶體;

這樣的方式是在堆區申請的記憶體,在linux中,其實是在申請的時候基本沒有限制,比如32位機器,理論上可以malloc(4g)的大小,因為2^32=4g,但事實上linux的程序位址空間是這樣的:

所以經過實驗,使用malloc最大能夠申請的空間是3g左右,這裡要注意,要使用下面這樣的方式申請空間:

[cpp]

view plain

copy

intmb = 0;  

while

(malloc(1 <

printf("allocate %d mb total\n"

, mb);  

不能直接

[cpp]

view plain

copy

size_t

mb = (

size_t

)(2147483648ul);  

char

*buf = (

char

*)malloc(mb);  

因為可能記憶體中存在碎片,記憶體空閒空間總和也許有3g,但是直接申請3g,可能會不成功,因為它不是連續的記憶體空間。

接下來我又迷茫了,為什麼申請堆空間不受到swap空間和物理記憶體大小的限制呢?由於linux使用的是虛擬記憶體,因此分配是不受影響的,但是,在使用的時候,我們同時使用的記憶體大小超過了swap空間和物理記憶體大小,將會出現一些問題,這裡有一篇文章說得不錯,記錄下:

第二種方式:使用int a申請記憶體;

這樣的方式是在棧區申請的記憶體,在linux中,會受到ulimit -a中stack size結果的影響

比如我的ulimit -a結果

[cpp]

view plain

copy

stack size              (kbytes, -s) 8192  

那麼**中

[cpp]

view plain

copy

//      int mb[2097152]; 4*2097152 = 8192kb

intmb[2090000];  

mb[0] = 0;  

mb[2090000 - 1] = 0;  

[cpp]

view plain

copy

intmb[2097152];  

使用int mb[2097152]會失敗,因為堆疊可能儲存引數,返回位址等等資訊,已經占用了部分堆疊,下面的mb[2090000]是可以成功的!

所以總結一下:如果用malloc的方式,乙個程序理論上是可以使用3g的記憶體(應該說可見),但是同時能夠使用的真正最大記憶體只有swap空間+物理空間這麼大

使用int a這樣的形式,申請的空間會受到ulimit -a中stack size的影響。

php?c=article&a=read&id=103888

.net/anghlq/article/details/7087069

linux C語言 記憶體申請 堆 棧 大小限制

一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下 開闢一片記憶體空間有2種方式,第一種 int a 第二種malloc,那麼在linux下,這兩種方式可以開闢...

C語言連續申請變數記憶體問題

這個問題是我最近遇到的乙個問題,這裡寫成部落格記錄下來.剛學計算機系統不就,如果有 不對的地方請指正。內容是下面這個樣子的 main.c include stdio.h int a 100,b 200 int main func.c double a void func 注意上面兩個 片是在同乙個工...

C語言動態記憶體申請分析

1 c語言中的一切操作都是基於記憶體的 2 變數和陣列都是記憶體的別名 1 記憶體分配由編譯器在編譯期間決定 2 定義陣列的時候必須指定陣列的長度 3 陣列的長度是在編譯期間就必須確定的 1 malloc和free用於執行動態記憶體分配和釋放 2 malloc所分配的是一塊連續的記憶體 3 mall...