1. 程式人生 > >malloc、calloc、realloc和alloca各種的區別

malloc、calloc、realloc和alloca各種的區別

calloc 一次 單元 不支持 new span 初始化 har 堆棧

需要先包含頭文件

#include"malloc.h" malloc是標準的在中開辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(p)才會釋放空間 calloc也是開辟空間,但是使用方式不一樣 比如 char *pt==(char *)calloc(100, sizeof(char)); 然後用calloc開辟的空間其內容會自動初始化為空,等於把該中使用的空間清零。也就是賦值‘\0‘。 原本未使用的空間內容都是‘?‘。 也需要用free來對該空間進行釋放 realloc對指針空間做重新定義,新的空間必須大於原來的空間。 比如 char *pt=(char *)malloc(10*sizeof(char)); realloc(pt, 1000*sizeof(char)); 如果小於原來的空間會造成一些異常。(編譯還是會通過) alloca
是最特殊的開辟棧空間方法,優點是當離開調用這個函數的時候,棧所分配的空間會自動釋放(也就是free)。 比如在一個函數中定義 void fun() { char *ptt=(char *)alloca(100*sizeof(char)); } 當跳出這個函數的時候,系統會自動free ptt這個空間。 但是他不是一個可移植的方法,如果處理器上不支持堆棧操作這個方法就不可用。(目前大部分處理器上都可以用。) 但是如果需要這個ptt在其他地方(這個函數外)還是需要使用,那麽這個方法就不可取了。 這個要說明一下free的作用,free並不是把棧的地址的內容給清零,而是告訴系統棧的某塊內容可以被使用而已。如果夠不告訴系統,則表明該區域一直在使用(實際上已經不使用了)。那麽系統在做下一次new或者malloc的操作的時候就會開辟另一個空間。但是棧空間是有限的,如果一直沒有free那麽這個棧就會溢出。 內存泄露的定義是:做malloc類似的開辟空間的操作之後,當不使用的時候不做釋放結果導致一直占據該內存單。(用動態存儲分配函數動態開辟的空間,在使用完畢後未釋放,結果導致一直占據該內存單元。直到程序結束。)

malloc、calloc、realloc和alloca各種的區別