函式原型: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.陣列在宣告的時候,必須指定陣列的長度,它所需要的內存在編譯時分配。但是對於空間的要求,不僅僅是...