上面的兩行**開闢空間的方式均是開闢了大小固定的空間。int a = 10;//在棧空間開闢了4個位元組
int arr[10];//在棧空間連續開闢了10個連續的4位元組空間
但是我們實際對空間的需求,不僅僅是上訴的情況。而是隨著程式執行的時候我們才知道我們需要的空間要多大,
那陣列的編譯時開闢空間的方式就不能買滿足了。
這時候就需要動態開闢記憶體了。
動態記憶體函式的介紹:malloc/calloc/realloc/free
malloc/free
c語言提供了乙個動態記憶體開闢的函式:void* malloc(size_t size);
這個函式向記憶體申請了一塊連續可用的空間,並返回指向這塊空間的指標。
1)如果開闢成功,則返回乙個只想開闢空間的指標。
2)如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。
3)返回值的型別是void* ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候需要使用者自己來決定。
4)如果引數size 為0,malloc的行為是標準的未定義的,有編譯器決定。
c語言提供了乙個跟他匹配只用的函式free,專門是用來做動態記憶體的釋放和**,函式原型:
void* free(void* ptr);
free函式用來釋放動態開闢的記憶體。
1)如果引數ptr 指向的空間不是動態開闢的,那麼free函式的行為是未定義的。
2)如果引數ptr 是null 指標,則函式什麼事都不做。
舉個栗子
我們看一下執行結果:int main()
} printf(" free(ptr); \n");
free(ptr); //釋放空間
for (int i = 0; i < 10; i++)
printf(" ptr = null; \n");
ptr = null; //原指標置空
for (int i = 0; i < 10; i++)
return 0;
}
![](https://pic.w3help.cc/361/54c63750b1bdadd7512770808db43.jpeg)
free();後的ptr真正存在的意義僅僅是幾個連續的位址,且每個位址沒有相應的空間。置空後的ptr位址變成了記憶體裡最開始的幾個連續位址。
calloc
c語言還提供了乙個函式calloc,它也是用來動態記憶體分配的
函式原型: void* calloc(size_t num,size_t size);
1)函式的功能是為num個大小為size的元素開闢一塊空間,並把空間的每乙個位元組初始化為0。
2)與函式malloc的區別只在於calloc會返回位址前把申請的空間的每個位元組都初始化為0;
如果我們對申請的空間自動初始化,我們用calloc就顯得非常方便了。
圖例:
realloc
有的時候我們發現我們以前開闢的空間不夠,太小了。或者我們我們之前開闢的空間太大了,為了合理的使用記憶體
我們就需要對記憶體的大小做一些靈活的調整。那麼realloc 函式就可以做到對 開闢記憶體大小的調整。
函式原型:void* realloc( void* ptr ,size_t size);
1)ptr是要調整的記憶體位址。
2)size是調整後的大小。
3)返回值為調整後的記憶體起始位置。
4)這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到新的空間裡。
5)realloc在調整記憶體空間的時候存在兩種情況:
情況1.原有空間之後有足夠大的空間。
情況2.原有空間之後沒有足夠大的空間。
舉個栗子:
6)開闢成功返回原位址或者新開闢的空間的位址;失敗返回null,所以我們要在使用動態開闢的記憶體之前,要先檢查一下是否開闢成功,即ptr!=null,我們才能使用。
注意:沒有釋放不再使用的動態開闢的記憶體空間會導致記憶體洩漏!
動態開闢空間以後,不用以後一定要釋放,並且正確釋放!
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...
C語言動態記憶體管理
c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...
C語言動態記憶體管理
在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...