記憶體配置設定和釋放函數malloc,calloc,realloc,free malloc()函數:配置設定記憶體空間 (m-memory) void *malloc(size_t size) 其中的size即為所用配置設定的記憶體空間的大小。malloc函數有一個将可用的記憶體塊連接配接為一個長長地清單即空閑連結清單。調用malloc函數的時候,它将沿着連接配接表尋找一個足以滿足使用者要求的記憶體塊。 calloc:配置設定記憶體空間并重新整理 void *calloc(size_t nitems, size_t size); Allocates the requested memory and returns a pointer to it. The requested size is nitems each size bytes long (total memory requested is nitems*size). The space is initialized to all zero bits. On success a pointer to the requested space is returned. On failure a null pointer is returned. 配置設定所要求的記憶體空間并傳回一個指向它的指針。要求的記憶體大小:nitems個大小為size的對象。所配置設定的記憶體被初始化為0。 如果配置設定成功則傳回指向所配置設定記憶體的指針;否則傳回NULL。 calloc與malloc:calloc初始化已配置設定的記憶體為0(calloc會把所配置設定的記憶體空間的每一位都初始化為0:如果為指針類型的元素配置設定記憶體,那麼這些元素通常會被初始化為空指針;如果為實型資料配置設定記憶體,則這些元素被初始化為浮點型的零),而malloc不初始化配置設定的記憶體。calloc傳回的是一個數組,而malloc傳回的是一個對象。calloc的效率一般是比較低的。 calloc相當于malloc後再加memset, realloc:重新配置設定記憶體(re-重新) void *realloc(void *ptr, size_t size); 更改以前配置設定區的長度(增加或減少)。當增加長度時,可能需将以前配置設定區的内容移到另一個足夠大的區域,而新增區域内的初始值則不确定。size是存儲區的newsize新長度,而不是新舊長度之差。例子: 如果先配置設定一個可容納長度為512的數組的空間,并在運作時填充它,但又發現空間不夠,則可調用realloc擴充該存儲空間。如果該存儲區後有足夠的空間可供擴充,則可在原存儲區位置上向高位址方向擴充,并傳回傳送給它的同樣的指針值。如果原存儲區後沒有足夠的空間,則realloc配置設定另一個足夠大的存儲區,将現存的512個元素數組的内容複制到新配置設定的存儲區。因為這種存儲區可能會移到位置,是以不應該使用任何指針指向該區中。 free: 釋放記憶體空間以供其他代碼使用 void free( void *p); 關于函數使用需要注意的一些地方: A、申請了記憶體空間後,必須檢查是否配置設定成功。 B、當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指針指向NULL,防止程式後面不小心使用了它。 C、這兩個函數應該是配對。如果申請後不釋放就是記憶體洩露;如果無故釋放那就是什麼也沒有做。釋放隻能一次,如果釋放兩次及兩次以上會出現錯誤(釋放空指針例外,釋放空指針其實也等于啥也沒做,是以釋放空指針釋放多少次都沒有問題)。 D、雖然malloc()函數的類型是(void *),任何類型的指針都可以轉換成(void *),但是最好還是在前面進行強制類型轉換,因為這樣可以躲過一 些編譯器的檢查。 還有一個函數是alloca函數,其調用序列與malloc相同,但是它是在棧幀上配置設定存儲空間。其優點是:當函數傳回時,自動釋放他所使用的棧幀,是以不必為釋放空間而費心。其缺點是:其缺點是:某些系統在函數已被調用後不能增加棧幀長度,于是也就不能支援alloca 函數。盡管如此,很多軟體包還是使用alloca函數,也有很多系統支援它。本文出自 51CTO.COM技術部落格 |
轉載于:https://www.cnblogs.com/jnje/archive/2011/03/10/1979728.html