動態記憶體分配

2021-06-21 05:45:59 字數 2519 閱讀 3774

c的儲存類別有4種:自動的(auto)、靜態的(statics)、暫存器的(register)、外部的(extern).

全域性變數時分配在記憶體中的靜態儲存區;

靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初值而是只保留上次函式呼叫結束時的值。自動變數則不是在編譯時賦初值,而是在函式呼叫時每次重新給一次初值。

非靜態的區域性變數(包括形參)是分配在記憶體中的動態儲存區的,即就是棧(stack)

記憶體動態分配:

存放臨時用的資料,這些資料不必在程式的申明部分定義,也不必等到函式結束時才釋放,而是需要時間隨時開闢,不需要時隨時釋放。這些資料臨時存放在乙個特別的自由儲存區,即就是堆(heap)區,

由於申請的資料沒有在宣告部分定義它們為變數或陣列,因此不能通過變數名或者陣列名去引用,只能通過指標來引用。

1.malloc ()函式:void* malloc(unsigned int size)

***@function:void* malloc(unsigned int size)

***@parameter:unsigned int size(要分配的動態記憶體大小的空間)

***@purpose:在記憶體的動態儲存區中分配乙個長度為size的連續空間。

***@return:指標的基型別為void,不指向任何型別的資料,只提供乙個位址;如果執行失敗,則返回空指標(null)。

結束使用的時候,通過free()來釋放。

ansic以前的c沒有void*這樣的型別,malloc()返回值得型別被定義為char*。所以要進行強制型別轉換。但是現在沒必要。

需要注意的是:c++中可以將任意的指標賦給void*型別的變數,但不能將void*型別的值賦給通常的指標變數。所以在c++中,malloc()的返回值必須要進行強制型別轉換。但c++中推薦使用new和delete來進行動態記憶體的分配和釋放。new/delete是乙個可以過載的操作符,要為其制定分配資料型別的,並非malloc()或者free()一樣的函式。

mallac()實現:遍利鍊錶尋找空的塊,如果能發現尺寸大小能滿足使用的塊,就分割出來使用,返回乙個使用區域的位址。如果不存在足夠大的塊,就請求作業系統對空間擴容(取得記憶體的手段根據作業系統的不同而各異,unix中是使用break()的系統呼叫。)free()函式可以將上下空的塊合併成乙個快,防止塊的碎片化。

2.calloc()函式:void* calloc(unsigned n, unsigned size)

***@function:void* calloc(unsigned n, unsigned size)

***@parameters: unsigned n, unsigned size    n*size

***@purpose:為一維陣列從動態儲存空間分配n個長度為size的連續空間

***@return:如果成功,返回指向分配域的起始位置的指標;失敗,返回null.

calloc()函式實質為: ptr = malloc(n*size);

memset(p, 0, n*size);

3.reallo()函式:void* realloc(void* p, unsigned int size)

***@function:void* realloc(void* p, unsigned int size)

***@parameters :void* p, unsigned int size

***@purpose:為已經通過malloc()函式或者calloc()函式分配的動態空間,改變大小重新分配為size。

***@return:如果成功,返回指向分配區域的位置指標,失敗,返回null

例如:ptr = calloc(20,4);//allocate 20*4 bytes temporary memory, return the begin address to pointer variable ptr.

realloc(ptr,50);//重新分配ptr所指向的動態空間,大小為50 bytes

p = realloc(p,0)//此時函式的作用和free(p)完全一樣

如果重新分配空間時,後面的空閒區域沒有足夠的空閒空間,就會導致複製的發生,降低效率。所以使用realloc()函式時,需謹慎。

4.free()函式:void free(void* p);

***@function:void free(void *ptr)

***@parameter:void *p(和calloc()或者malloc()對應的最近一次返回值)

***@purpose:釋放指標變數p所指向的動態空間。

***@return:none

如果對malloc()函式或者calloc()函式分配的動態記憶體不能及時釋放,就會導致記憶體洩露,這在嵌入式程式設計時是很需要注意的,否則導致程式崩潰!!pc機上使用的作業系統,在程序結束時,會釋放曾經分配給當前程序的記憶體空間,但還是要求free()。

防止記憶體洩露的乙個小方法是:將malloc()函式和free()函式分別進行小的封裝,每呼叫一次,呼叫次數加1,最後比較兩個函式被呼叫的次數是否一致。

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

在c語言中動態記憶體分配函式是malloc 函式名 malloc 函式原型 extern void malloc unsigned int num bytes 函式功能 分配記憶體 引數 記憶體大小 返回值 void型別指標 函式名 free 函式原型 void free void ptr 函式功能...