做藥材有什么好的網(wǎng)站seo外包公司興田德潤
?malloc和free的語法格式
`malloc` 函數(shù)是 C 語言標(biāo)準(zhǔn)庫中的一個重要函數(shù),用于動態(tài)分配內(nèi)存。其語法如下:
void *malloc(size_t size);
這里的 `void *` 表示返回的是一個 `void` 類型的指針,實際上這個指針指向的是一個 `char` 類型的內(nèi)存塊。`size_t` 是一個無符號整數(shù)類型,用于指定分配的內(nèi)存大小。
當(dāng)你調(diào)用 `malloc` 函數(shù)時,你需要提供一個參數(shù) `size`,表示你需要分配的內(nèi)存的大小(以字節(jié)為單位)。函數(shù)返回一個指針,指向為你分配的內(nèi)存區(qū)域的開始位置。如果分配成功,這個指針不會是 `NULL`;如果分配失敗(比如,系統(tǒng)沒有足夠的內(nèi)存來滿足請求),`malloc` 函數(shù)會返回 `NULL`。
在使用 `malloc` 分配的內(nèi)存時,你需要使用 `memcpy`,`strcpy` 等函數(shù)來復(fù)制數(shù)據(jù)到這個內(nèi)存區(qū)域,而不是 `strcpy`,`printf` 等函數(shù),因為這些函數(shù)不適用于動態(tài)分配的內(nèi)存。
在使用完動態(tài)分配的內(nèi)存后,你應(yīng)該使用 `free` 函數(shù)來釋放內(nèi)存,以避免內(nèi)存泄漏。
free(void *ptr);
這里的 `ptr` 是之前 `malloc` 或其他動態(tài)內(nèi)存分配函數(shù)(如 `calloc`,`realloc`)返回的指針。使用 `free` 后,指針?biāo)赶虻膬?nèi)存將被釋放,可以被系統(tǒng)重新分配給其他請求。但是,免費的內(nèi)存不會立即變得可被其他程序使用,這是一個操作系統(tǒng)和硬件相關(guān)的過程。
這里是需要把這兩個函數(shù)放到一起講解的,因為申請內(nèi)存空間你就得釋放內(nèi)存空間,不然會導(dǎo)致內(nèi)存泄漏,內(nèi)存泄漏會導(dǎo)致電腦內(nèi)存里面可以使用的空間越來越少。最后導(dǎo)致崩盤。
———————————————————————————————————————————
malloc和free函數(shù)的使用?
申請內(nèi)存空間
返回函數(shù) 一定要做檢查
頭文件stdlib.h
perror打印出錯誤
動態(tài)內(nèi)存的開辟空間都在堆區(qū)
釋放內(nèi)存
傳遞的參數(shù) p就可以
解釋一下
所以 此時釋放的是自己的權(quán)限
但是需要知道的是 此時p也就是野指針了
所以此時我們把p栓到樹上
也就是設(shè)置為空指針
———————————————————————————————————————————
?這里開辟內(nèi)存空間注意的三點(重點)
1
這里需要進行強制類型的轉(zhuǎn)化因為從語法格式我們可以看出來,這里是的void*類型,也就是不明確的類型,為什么,因為C語言官方在設(shè)定的時候不清楚你開辟內(nèi)存空間的目的是干什么用的,不知道是用于整數(shù)的存儲,還是用于字符的打印,還是干什么。所以這里給出無返回類型,只需要你在使用的時候進行強制類型轉(zhuǎn)化就可以。這樣可以提升代碼的兼容性和健壯性。
2.
對于空間的釋放,釋放空間之后盡量的讓指針指向NULL,也就是空指針,因為當(dāng)指針指向的空阿金釋放之后,本質(zhì)上他是不指向任何的數(shù)值了,也就是此時他是野指針了,雖然你不使用他了,但是最好指向空指針。防止內(nèi)存的泄露
3.
使用空間的時候,你不能讓指針跟著走,我們可以看到代碼里面,
使用的是這個代碼*(p+i)=I+1;。而不是*(p)=i;p++;這樣的代碼。
為什么,因為當(dāng)指針走遠(yuǎn)之后,你進行釋放空間的時候,本質(zhì)上釋放的是指針移動后指向的空間,你讓指針一直移動,移動到開辟的空間的最后一個位置,然后再進行釋放空間的時候,其實本質(zhì)上釋放的是開辟空間之后的空間,也就是沒有釋放空間。
你創(chuàng)建了空間,但是沒有釋放空間,此時會導(dǎo)致內(nèi)存泄露。
內(nèi)存泄露的問題我們也聊過,也就是內(nèi)存占用少的時候還不明顯,但是當(dāng)有大量程序運行的時候,就會導(dǎo)致內(nèi)存一直占用,但是得不到釋放。從而導(dǎo)致崩盤。
4.
malloc函數(shù)里面放置的是字節(jié)大小,這里放置的是字節(jié)大小,不是bit大小,這里一定要記住。
———————————————————————————————————————————
malloc和free代碼
int main()
{//malloc不初始化開辟空間//開辟20個字節(jié)的空間大小 int* p = (int*)malloc(5 * sizeof(int));if (p == NULL){perror("malloc:");//這里是打印錯誤信息,return 1;}for (int i = 0; i < 5; i++)//這里是打印出來開辟的空間 賦值之后進行打印 {*(p + i) = i + 1;//這里是進行賦值 賦值從1開始printf("%d ", *(p + i));//這里是打印出來}free(p);//這里進行指針的釋放p = NULL;//防止野指針的問題,我們指向空指針return 0;
}
malloc第兩種寫法
可以是sizeof(int)=四個字節(jié)
然后5*sizeof(int)=20個字節(jié)
第二種就是上述的寫法malloc(20)