C 兩種記憶體分配方式基礎

2021-09-30 10:16:16 字數 1107 閱讀 1923

靜態分配:即編譯時在處理程式源**時分配;

動態分配:即程式執行時呼叫執行時刻庫函式來分配;

靜態與動態分配記憶體的兩個主要區別:

1、靜態物件是有名字的變數,我們直接對其進行操作。而動態物件是沒有名字的變數,我們通過指標間接地對他進行操作。

靜態物件:

int ival = 123;

動態物件:

int *pint = new int(1024);

//或者

int *pia = new int[4];

2、靜態物件的分配與釋放由編譯器自動處理,程式設計師需要理解這一點,但不需要做任何事情。相反,動態物件的分配和釋放,必須由程式設計師顯式的管理。

對於動態物件的分配可通過new表示式的兩個版本之一來完成。

第乙個版本,用於分配特定型別的單個物件。例如:

int *pint = new int(1024);
上述語句意思是,分配乙個沒有名字的int型別物件,物件初始值為1024。然後表示式返回物件在記憶體中的位址。接著,這個記憶體位址被用來初始化指標物件pint。對於動態分配的記憶體,唯一的訪問方式是通過指標間接地訪問。

第二個版本,用於分配特定型別和維數的陣列。例如:

int *pia = new int[4];
上述語句的意思是,分配乙個含有四個整形元素的陣列。不幸的是,我們沒有辦法給動態分配的陣列中的每乙個值顯式的指定乙個初始值。

分配動態陣列時乙個常令人迷惑的問題是,返回值只是乙個指標,與分配單個物件的返回值型別相同。例如,pia和pint的不同之處在於,pia是擁有四個元素陣列的第乙個元素的位址,而pint只是簡單的包含單一物件的位址。

當用完了動態分配的物件或物件的陣列時必須顯式的釋放這些記憶體。我們可以通過使用delete表示式的兩個版本之一來完成這件事,而釋放之後的記憶體則可以被程式重新使用。

單一物件的delete表示式:

delete pint;
物件的陣列的delete表示式:

delete  pia;

C記憶體分配方式與C 記憶體分配方式

c記憶體分配方式 注 malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二 一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組 接下來,將分配...

C 記憶體分配方式

在c 中,記憶體分成5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。和堆一樣,使用者棧在程...

C 記憶體分配方式

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數名,區域性變數的名等。其操作方式類似於資料結構中的棧。2 堆區 heap 由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於...