malloc、calloc、realloc和alloca各种的区别
生活随笔
收集整理的這篇文章主要介紹了
malloc、calloc、realloc和alloca各种的区别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
需要先包含頭文件
#include"malloc.h" malloc是標(biāo)準(zhǔn)的在堆中開(kāi)辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(p)才會(huì)釋放空間 calloc也是開(kāi)辟空間,但是使用方式不一樣 比如 char *pt==(char *)calloc(100, sizeof(char)); 然后用calloc開(kāi)辟的空間其內(nèi)容會(huì)自動(dòng)初始化為空,等于把該棧中使用的空間清零。也就是賦值'\0'。 原本未使用的空間內(nèi)容都是'?'。 也需要用free來(lái)對(duì)該空間進(jìn)行釋放 realloc對(duì)指針空間做重新定義,新的空間必須大于原來(lái)的空間。 比如 char *pt=(char *)malloc(10*sizeof(char)); realloc(pt, 1000*sizeof(char)); 如果小于原來(lái)的空間會(huì)造成一些異常。(編譯還是會(huì)通過(guò)) alloca是最特殊的開(kāi)辟棧空間方法,優(yōu)點(diǎn)是當(dāng)離開(kāi)調(diào)用這個(gè)函數(shù)的時(shí)候,棧所分配的空間會(huì)自動(dòng)釋放(也就是free)。 比如在一個(gè)函數(shù)中定義 void fun() { char *ptt=(char *)alloca(100*sizeof(char)); } 當(dāng)跳出這個(gè)函數(shù)的時(shí)候,系統(tǒng)會(huì)自動(dòng)free ptt這個(gè)空間。 但是他不是一個(gè)可移植的方法,如果處理器上不支持堆棧操作這個(gè)方法就不可用。(目前大部分處理器上都可以用。) 但是如果需要這個(gè)ptt在其他地方(這個(gè)函數(shù)外)還是需要使用,那么這個(gè)方法就不可取了。 這個(gè)要說(shuō)明一下free的作用,free并不是把棧的地址的內(nèi)容給清零,而是告訴系統(tǒng)棧的某塊內(nèi)容可以被使用而已。如果夠不告訴系統(tǒng),則表明該區(qū)域一直在使用(實(shí)際上已經(jīng)不使用了)。那么系統(tǒng)在做下一次new或者malloc的操作的時(shí)候就會(huì)開(kāi)辟另一個(gè)空間。但是棧空間是有限的,如果一直沒(méi)有free那么這個(gè)棧就會(huì)溢出。 內(nèi)存泄露的定義是:做malloc類似的開(kāi)辟空間的操作之后,當(dāng)不使用的時(shí)候不做釋放結(jié)果導(dǎo)致一直占據(jù)該內(nèi)存單。(用動(dòng)態(tài)存儲(chǔ)分配函數(shù)動(dòng)態(tài)開(kāi)辟的空間,在使用完畢后未釋放,結(jié)果導(dǎo)致一直占據(jù)該內(nèi)存單元。直到程序結(jié)束。)轉(zhuǎn)載于:https://www.cnblogs.com/Ph-one/p/6812276.html
總結(jié)
以上是生活随笔為你收集整理的malloc、calloc、realloc和alloca各种的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java枚举的简单介绍
- 下一篇: spring解析配置文件(三)