C語言動態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解
一、malloc函數(shù)
需要頭文件——<stdlib.h>
瀏覽器直接翻譯:
malloc函數(shù)(動態(tài)內(nèi)存開辟的函數(shù)):
void* malloc(size_t size);
功能:
- 這個函數(shù)向內(nèi)存申請一個連續(xù)可用的空間,并返回指向這塊空間的指針。
- 如果開辟成功,則返回一個指向開辟好空間的指針。
- 如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
- 返回值的類型是void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候由使用者自己決定。
- 如果size為0,malloc的行為是標(biāo)準(zhǔn)還是未定義的,由編譯器決定。
- malloc申請的空間,當(dāng)程序退出時,要還給操作系統(tǒng),當(dāng)程序不退出,動態(tài)申請的內(nèi)存,不會主動釋放,需要用free函數(shù)來釋放。
malloc申請的內(nèi)存空間:
malloc申請到空間后,直接返回這個空間的首地址,不會初始化空間的內(nèi)容。
舉個例子:
#include <stdio.h> #include <stdlib.h> int main() { //變長數(shù)組的知識點(vs不能用,gcc可以用) //int num = 0; //scanf("%d", &num); //int arr[num] = { 0 }; int* ptr = NULL; ptr = (int*)malloc(40); if (ptr == NULL)//判斷ptr指針是否為空 { perror("malloc"); exit; } else { int i = 0; for (i = 0; i < 10; i++)//給開辟的空間賦值 ptr[i] = i + 1; } free(ptr);//釋放ptr指向的空間 ptr = NULL;//讓ptr指向空 return 0; }
二、calloc函數(shù)
需要頭文件——<stdlib.h>
瀏覽器直接翻譯:
calloc函數(shù)(動態(tài)內(nèi)存分配函數(shù)):
void* calloc(size_t num, size_t size);
功能:
- 函數(shù)的功能是,為num個大小為size元素開辟一塊空間,并且把空間的每一個字節(jié)初始化為0.
- 與malloc函數(shù)的區(qū)別,只在于calloc函數(shù)會在返回地址之前把申請空間的每一個字節(jié)初始化為0.
舉個例子:
#include <stdio.h> #include <stdlib.h> int main() { int* p = (int*)calloc( 10,sizeof(int)); if (p == NULL)//成立,開辟失敗 { perror("calloc"); exit; } free(p); p = NULL; return 0; }
p指向的地址:
三、realloc函數(shù)
需要頭文件——<stdlib.h>
瀏覽器直接翻譯:
realloc函數(shù)(動態(tài)內(nèi)存管理更加靈活):
有時候我們發(fā)現(xiàn)過去申請的空間小了,有時候我們會覺得過去申請的空間過大,為了合理使用內(nèi)存,我們一定要對內(nèi)存的大小做靈活的調(diào)整。realloc函數(shù)可以做到對動態(tài)開辟內(nèi)存大小進行調(diào)整。
void* realloc(void* ptr, size_t size);
功能:
- ptr是要調(diào)整的內(nèi)存地址。
- size是調(diào)整后的新大小。
- 返回值為調(diào)整之后的內(nèi)存起始位置。
- 這個函數(shù)在調(diào)整原空間大小的基礎(chǔ)上,還會將原來的數(shù)據(jù)移到新的空間。
注意:
realloc調(diào)整內(nèi)存空間有兩種情況。
- 情況1:原有空間之后有足夠大的空間(原地擴容)。當(dāng)是情況1的時候,要擴展內(nèi)存就直接在原有內(nèi)存之后直接追加空間,原來空間的數(shù)據(jù)不發(fā)生改變。
- 情況2:原有空間后面沒有足夠大的空間(異地擴容)。當(dāng)是情況2的時候,原有空間后面沒有足夠多的空間時,擴展的方法是:在堆空間上另外找一個合適大小的連續(xù)空間來使用。這樣函數(shù)返回的是一個新的內(nèi)存地址。
所以我們在使用realloc函數(shù)的時候一定要注意:
1、開辟新的空間。
2、 會將舊的空間數(shù)據(jù)拷貝到新的空間。
3、釋放舊的空間。
4、返回新空間的起始地址。
舉個例子:
#include <stdio.h> #include <stdlib.h> int main() { int* ptr =(int*) malloc( 100 ); if (ptr != NULL) { //可以使用這個空間 } else { perror("malloc"); exit; } //擴展空間 int* p = (int*)realloc(ptr, 1000);//可能增容失敗 if (p != NULL) { //增容成功 ptr = p;//p指向的空間交給ptr去維護 } free(ptr);//把開辟早堆上的空間釋放掉 ptr = NULL; return 0; }
四、free函數(shù)
需要頭文件——<stdlib.h>
瀏覽器直接翻譯:
free函數(shù)(釋放動態(tài)開辟的內(nèi)存):
void* free(void* ptr);
功能:
- 如果參數(shù)ptr指向的那個空間不是動態(tài)開辟的,那free函數(shù)的行為是未定義的。
- 如果參數(shù)ptr是NULL指針,則函數(shù)什么事都不做。
到此這篇關(guān)于C語言動態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解的文章就介紹到這了,更多相關(guān)C語言動態(tài)內(nèi)存函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS報錯C6011的問題:取消對NULL指針的引用(解決方法)
這篇文章主要介紹了VS報錯C6011的問題:取消對NULL指針的引用(解決方法),C6011:取消對NULL指針的引用,發(fā)現(xiàn)是沒有進行空指針的判斷,解決方案跟隨小編一起看看吧2024-01-01C語言實現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng)
這篇文章主要介紹了C語言實現(xiàn)學(xué)生獎學(xué)金評定系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03C語言編程簡單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解
這篇文章主要為大家介紹了C語言編程中非常簡單卻又非常重要的數(shù)據(jù)結(jié)構(gòu)順序表的全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10