C語言中的動態記憶體分配

2021-09-26 15:19:47 字數 3205 閱讀 3307

目錄

什麼是記憶體的動態分配?

怎樣建立記憶體的動態分配?

用malloc函式開闢動態儲存區

用calloc函式開闢動態儲存區

用realloc函式重新分配動態儲存區

用free函式釋放動態儲存區

void指標型別

全域性變數是分配在記憶體中的靜態儲存區的,非靜態的區域性變數(

包括形參

)是分配在記憶體中的動態儲存區的,這個儲存區是乙個稱為

棧(stack)

的區域。除此以外,

c語言還允許建立記憶體動態分配區域,以存放一些臨時用的資料,這些資料不必在程式的宣告部分定義,也不必等到函式結束時才釋放,而是需要時隨時開闢,不需要時隨時釋放。這些資料是臨時存放在乙個特別的自由儲存區,稱為

堆(heap)

區。可以根據需要,向系統申請所需大小的空間。由於未在宣告部分定義它們為變數或陣列,因此不能通過變數名或陣列名去引用這些資料,只能通過指標來引用。

函式原型為:

void*malloc(unsigned int size);
作用是在記憶體的動態儲存區中分配乙個長度為

size

的連續空間。形參

size

的型別定為無符號整型

(不允許為負數

)。此函式的值(即「返回值」)是所分配區域的第乙個位元組的位址,或者說,此函式是乙個指標型函式,返回的指標指向該分配域的第乙個位元組。

int *pnumber = (int*)malloc(100); // 分配100位元組記憶體

int *pnumber = (int*)malloc(25*sizeof(int));//儲存25個int值的記憶體

型別轉換(int*)將函式返回的位址轉換成 int 型別的指標。

在呼叫 malloc() 時,應該利用 sizeof 計算儲存塊大小,不要直接寫數值,因為不同平台資料型別占用空間大小可能不同

注意:指標的基型別為void,即不指向任何型別的資料,只提供乙個純位址。如果此函式未能成功地執行(例如記憶體空間不足),則返回空指標(null)。

用 if 語句檢查是否分配:

int *pnumber = (int*)malloc(25*sizeof(int));

if (!pnumber)

函式原型為:

void *calloc(unsigned n,unsigned size);
作用是在記憶體的動態儲存區中分配

n個長度為

size

的連續空間,這個空間一般比較大,足以

儲存乙個陣列。 用

calloc

函式可以為一維陣列開闢動態儲存空間,

n為陣列元素個數,每個元素長度為

size

。這就是動態陣列。函式返回指向所分配域的第乙個位元組的指標;如果分配不成功,返回

null

int *pnumber = (int*)calloc(75, sizeof(int));    

// 分配了包含75個int元素的陣列

colloc() 與 malloc() 相比有兩個優點:

(1)它把記憶體分配為給定大小的陣列;

(2)它初始化了所分配的記憶體,所有位都是 0。

函式原型為: 

void *realloc(void*p,unsigned int size);
如果已經通過

malloc

函式或calloc

函式獲得了動態空間,想改變其大小,可以用

realloc

函式重新分配。 用

realloc

函式將p

所指向的動態空間的大小改變為

size。p

的值不變。如果重分配不成功,返回

null

。函式原型為 

void free(void *p);
作用是釋放指標變數

p所指向的動態空間,使這部分空間能重新被其他變數使用。

p應是最近一次呼叫

calloc

或malloc

函式時得到的函式返回值。

free(p);  //釋放指標變數p所指向的已分配的動態空間
注意:以上4個函式的以上4個函式的宣告在stdlib.h標頭檔案中,在用到這些函式時應當用「#include 」指令把stdlib.h標頭檔案包含到程式檔案中。

c 99

允許使用基型別為

void

的指標型別。可以定義乙個基型別為

void

的指標變數(即

void*

型變數)

,它不指向任何型別的資料。在將它的值賦給另一指標變數時由系統對它進行型別轉換,使之適合於被賦值的變數的型別。

int *pt;

pt=(int *)mcaloc(100); //mcaloc(100)是void *型,把它轉換為int *型

注意:不要把「指向void型別」理解為能指向「任何的型別」的資料,而應理解為「指向空型別」或「不指向確定的型別」的資料。

例:建立動態陣列,輸入5個學生的成績,另外用乙個函式檢查其中有無低於60分的,輸出不合格的成績。

#include #include //程式中用了malloc函式,應包含stdlib.h

int main()

void check(int *p) //定義check函式,形參是int*指標

執行程式:

例二:演示動態記憶體分配:

#include#includeint main()

執行程式:

C語言中動態記憶體分配

c語言用了蠻久了,最近在寫乙個dsp的程式,發現動態記憶體使用這一塊還是很欠缺,於是又重新看了看c的書,總結一下。之前常見的陣列或結構體內存分配,其長度必須是固定的常數,如 int a 10 等,當需要申請變長陣列時,常規的直接定義就不可以了,如float b n 其中n為變數 好像c99之後可以這...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言中的動態記憶體分配詳解

c語言中最難也最重要的要數指標這一章了,對指標的熟練程度決定了你對 c語言的學習的好壞程度,筆者自己在學習 c語言時,在指標上花費的時間幾乎等於學習其他基礎知識的時間,所以,對指標這一章有著自己獨特的見解和學習方法。指標,簡單來說其作用就是用來操作記憶體的,而c 語言中動態記憶體分配就是一大難點,所...