C語言 動態開闢記憶體管理

2021-10-11 00:16:22 字數 3083 閱讀 1336

函式原型:void* malloc (size_t size);

引數為要申請空間的大小,單位為byte.

這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。

1、如果開闢成功,則返回乙個指向開闢好空間的指標。

2、如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。

3、返回值的型別是 void* ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。

4、如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。

用法:int *p = (int*)malloc(num*sizeof(int));
測試**演示

#include

#include

intmain()

for(

int i =

0; i < num; i++

)for

(int i =

0; i < num; i++

)printf

("\n");

free

(p);

//釋放空間

p =null

;//釋放指標

return0;

}

執行結果

用法注意:當malloc申請一塊空間的時候,要先判斷空間是否開闢成功,如果空間不夠大,則開闢失敗,所接收空間的指標返回的是乙個null。當用完乙個所申請的空間時,要釋放空間,並且釋放指標(置指標為空)

函式原型:void* calloc (size_t num, size_t size);
1、函式的功能是為 num 個大小為 size 的元素開闢一塊空間,並且把空間的每個位元組初始化為0。

2、與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0

測試**演示:

#include

#include

intmain()

for(

int i =

0; i < num; i++

)printf

("\n");

free

(p);

p =null

;return0;

}

執行結果

用法注意:和malloc一樣,也要先判斷空間是否申請成功,最後要釋放空間和釋放指標。和malloc最主要的區別就是申請空間的同時並初始化空間,置為0。

函式原型:void* realloc (void* ptr, size_t size);
1、ptr 是要調整的記憶體位址

2、size 調整之後新大小

3、返回值為調整之後的記憶體起始位置。

4、這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到新的空間

測試**演示

#include

#include

intmain()

for(

int i =

0; i < num; i++

)for

(int i =

0; i < num; i++

)printf

("\n");

num =15;

p =(int*)

realloc

(p,sizeof

(int

)*num)

;//開闢 15*4 位元組空間if(

null

== p)

for(

int i =

9; i < num; i++

)for

(int i =

0; i < num; i++

)printf

("\n");

free

(p);

p =null

;return0;

}

環境使用:

1、realloc函式的出現讓動態記憶體管理更加靈活。

2、有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體,

我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整

用法注意:和malloc一樣,也要先判斷空間是否申請成功,最後要釋放空間和釋放指標。因為realloc函式有返回值,此時一定要接收返回值,不然就是個定時炸彈,當遇到情況一(下面有解釋)時,此時程式就會崩潰。

執行結果

底層原理:realloc在調整記憶體空間的是存在兩種情況

情況一:原有空間之後有足夠大的空間。當原有空間之後有足夠大的空間時,realloc函式會在原空間後相繼開闢空間,使之成為乙個連續的空間,並且不會清空前面已經開闢的空間。

情況二,當原有空間之後沒有足夠大的空間,當原有空間之後沒有足夠大的空間時,realloc函式會重新開闢乙個新的空間,並將之前所開闢的空間的資料保留下來

1、對null指標的解引用操作

2、對動態開闢空間的越界訪問

3、對非動態開闢記憶體使用free釋放

4、使用free釋放一塊動態開闢記憶體的一部分

5、對同一塊動態記憶體多次釋放

6、動態開闢記憶體忘記釋放(記憶體洩漏)(最容易被遺忘)

並非所有動態開闢的函式都需要釋放:_alloca()函式,因為此函式開闢的空間都是在棧區,系統會自己釋放,而上面所講的3個函式都是在堆區開闢的空間,都需要自己去釋放。

(C語言)動態記憶體開闢

資料的元素儲存於記憶體中連續的位置上,當乙個陣列被宣告時,他所需要的內存在編譯時就被分配。當然,我們也可以使用動態記憶體分配在執行時為他分配記憶體。在動態記憶體分配中我們需要經常用到malloc,free,calloc,realloc這四個函式。malloc和free分別用於執行動態記憶體分配和釋放...

C語言 動態記憶體開闢

動態記憶體開闢是根據使用者的需要來開闢開間,是在堆上開闢空間的。用於開闢一塊連續的記憶體空間。函式原型 void malloc size t size malloc函式的返回值是乙個void型別的指標,引數為無符號型別資料即申請分配的記憶體大小,單位是位元組。記憶體開闢成功,返回這塊空間的首位址,失...

C語言 動態記憶體開闢

我們已經掌握的記憶體開闢方式有 int val 20 在棧空間上開闢四個位元組 char arr 10 在棧空間上開闢10個位元組的連續空間但是上述開闢空間的方式有兩個特點 1.空間開闢的大小是固定的。2.陣列在宣告的時候,必須指定陣列的長度,它所需要的內存在編譯時分配。但是對於空間的要求,不僅僅是...