C語言 記憶體分配

2021-08-14 23:04:53 字數 1751 閱讀 1472

分配記憶體在棧中,如果超出分配記憶體的大小,會報stack overflow錯誤。

int a[1024 * 1024 * 10];
1.棧區(statck),windows下,棧記憶體分配確定的常數,超出了限制,就會提示stack overflow錯誤。棧記憶體自動分配,釋放。

2.堆區(heap)

程式設計師手動分配和釋放,可以分配作業系統大概80%的記憶體

3.全域性區或者叫靜態區

4.字元常量區

5.程式**區

float* p = malloc(1024 * 1024 * 10 * sizeof(float));
malloc返回值是void * ,可以是任意型別的指標

sizeof(int)提公升**可讀性

free()函式釋放記憶體

當程式退出時,作業系統會自動釋放所有分配給程式的記憶體,但是,建議您在不需要記憶體時,都應該呼叫函式 free() 來釋放記憶體。

//動態記憶體分配

float* p = malloc(1024 * 1024 * 10 * sizeof(float));

//釋放

free(p);

realloc() 來增加或減少已分配的記憶體塊的大小

重新分配記憶體的兩種情況

如果是縮小的情況下,縮小的那部分資料會丟失

如果是擴大的情況下

1.如果當前記憶體段後面有需要的記憶體空間,直接擴充套件這段記憶體空間,realloc返回原指標

2.如果當前記憶體段後面的空閒位元組不夠(已經被其他程式所使用了),那麼就使用堆中第乙個能夠滿足這一要求的記憶體塊,將目前的資料複製到新的位置,並將原來的資料庫釋放掉,返回新的記憶體位址。

3.如果申請失敗(沒有那麼大的記憶體),返回null,原來的指標任然有效

int len;

printf("第一次輸入陣列的長度:");

scanf("%d", &len);

int* p = malloc(len * sizeof(int));

//int* p = calloc(len, sizeof(int)); //malloc和calloc作用一樣,colloc不用自己計算,一般使用malloc即可

for (int i = 0; i < len; i++)

int addlen;

printf("輸入陣列增加的長度(可輸入負數,釋放部分記憶體):");

scanf("%d", &addlen);

//擴大剛剛分配的記憶體空間

//引數1.原來記憶體的指標 引數2.記憶體擴大之後的總大小

int* p2 = realloc(p, sizeof(int)*(len + addlen));

if (p2==null)

//重新賦值

for (int i = 0; i < len+addlen; i++)

//手動釋放記憶體

if (p!=null)

if (p2!=null)

分配記憶體的大小是固定的,程式還沒執行的時候,就知道要開闢多大的棧記憶體區域。

缺點: 1. 很容易超出棧記憶體的最大量

2.為了防止記憶體不夠用,會開闢更多的記憶體,容易浪費記憶體

在程式執行過程中動態指定需要使用的記憶體大小,手動釋放,釋放之後,這些記憶體還可以在應用內重新使用。

參考 c 語言教程

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...