C記憶體申請函式
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/pingnanlee/article/details/8236440
C語言跟記憶體申請相關的函式主要有 alloca、calloc、malloc、free、realloc。
alloca是向棧申請記憶體,無需釋放。
malloc分配的記憶體是位於堆中的,並且沒有初始化記憶體的內容,因此基本上malloc之後都會呼叫函式memset來初始化這部分的記憶體空間(大於128K時,使用mmap函式分配在檔案對映區)。malloc()函式有一個引數,即要分配的記憶體空間的大小, Void *malloc(size_t size);
calloc申請並初始化這部分的記憶體為0。calloc()函式有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小,void *calloc(size_t numElements,size_t sizeOfElement)。 calloc() 函式會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為零;如果你是為指標型別的元素分配記憶體,那麼這些元素通常(但無法保證)會被初始化為空指標;如果你是為實數型別的元素分配記憶體,那麼這些元素可能(只在某些計算機中)會被初始化為浮點型的零。
realloc是對malloc申請的記憶體進行大小的調整,申請的記憶體最終需要通過函式free來釋放。
malloc() 函式和calloc ()函式的另一點區別是calloc()函式會返回一個由某種物件組成的陣列,但malloc()函式只返回一個物件。為了明確是為一個數組分配記憶體空間,有些程式設計師會選用calloc()函式。但是,除了是否初始化所分配的記憶體空間這一點之外,絕大多數程式設計師認為以下兩種函式呼叫方式沒有區別:calloc(numElements ,sizeOfElement); malloc(numElements *sizeOfElement) ; 需要解釋的一點是,理論上(按照ANSIC標準)指標的算術運算只能在一個指定的陣列中進行,但是在實踐中,即使C編譯程式或翻譯器遵循這種規定,許多C程式還是衝破了這種限制。因此,儘管malloc()函式並不能返回一個數組,它所分配的記憶體空間仍然能供一個數組使用(對realloc()函式來說同樣如此,儘管它也不能返回一個數組)。
總之,當你在calloc()函式和malloc()函式之間作選擇時,你只需考慮是否要初始化所分配的記憶體空間,而不用考慮函式是否能返回一個數組。