指標 堆記憶體分配(動態記憶體)

2021-04-17 09:14:09 字數 2005 閱讀 7735

一、對於普通陣列來說,在定義或初始化時必須確定元素個數,即下標必須是已知的,即在編譯時已知。

例:定義陣列時 int a[6];

初始化陣列時,float a=;

對陣列a來說,雖然沒有下標,但是通過{}中的元素個數,可以查出其下標為4。

像這樣的格式:

int a;                                   錯誤,下標未知

int a[n];                                 錯誤,同上

int m=10; int a[m];              錯誤,m是變數,在編譯時未知

對於下面格式:

const int size=50;

const int  chs=size*sizeof(int);

int a[size];

char  s[chs];

由於size和s是常量,它們在編譯時可知,所以格式正確。

所以常量可以作為下標。

二、通過堆記憶體分配,可以在定義或初始化時不必確定確定元素個數,即在編譯時不知,而在執行時已知。

1、使用malloc和free

其語法要求:

(1) #include

(2) 指標名=void* malloc (記憶體大小);

(3) free(指標名);

說明:(1)其中的void*為預設型別,表明這個記憶體空間型別不確定。如果要確定其型別,則必須進行強制型別轉換。

(2)記憶體的大小可以直接寫出,也可以通過元素個數乘以sizeof(type)計算。

例1:#include

<

iostream.h

>

#include

<

alloc.h

>

void

main()

其中(int*)進行強制型別轉換,(arraysize *sizeof(int))計算array堆記憶體所佔的空間量。

free(array)用來釋放堆記憶體。

2、使用new和delete

其語法要求:

動態變數

動態陣列

不需要檔案頭

不需要檔案頭

指標名=new 型別名;

指標名 = new 型別名[元素個數];

delete 指標名;

delete [ ]指標名;

說明:(1)不需要標頭檔案

(2)動態陣列只需要元素個數,不需要計算其記憶體空間

(3)malloc定義空間時用(),而new定義空間時用[ ]

(4)對動態變數可以直接初始化,格式為 指標名=new 型別名(初始化值)

例2:#include

<

iostream.h

>

void

main()

三、分配記憶體失敗

在分配動態記憶體時,有時候因為記憶體被占用,可以會分配失敗,在這樣的情況下,後面的操作是無效的。所以要設定乙個判定條件,讓記憶體分配成功時再執行。

記憶體分配失敗的標誌是,動態指標的值為null,所以可以用if判定。

因此上述兩個例子可以改為:

例1改為:

#include

<

iostream.h

>

#include

<

alloc.h

>

void

main()

例2改為:

#include

<

iostream.h

>

void

main()

四、malloc和free是c語言的命令,new和delete是c++的命令,推薦使用後者,因功能更強大。

動態分配記憶體後,必須手工刪除。否則會導致記憶體溢位。

指標 動態記憶體分配

c 中的動態記憶體分配機制 c 中使用new和delete來完成在堆上對動態記憶體的分配和釋放。注.所有指標都應該被初始化 如果指標指向的動態記憶體被釋放或沒有指向合法的位址,就應該將指標設定為nullptr,否則記憶體洩漏 變數 double pvalue pvalue new double pv...

指標 3(動態記憶體分配)

動態記憶體分配 重點 傳統陣列的缺點 1.陣列長度必須事先制定,且只能是常數,不能是變數 例 int a 5 ok int len 5 int a len error 2.傳統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放 在乙個函式執行期間,系統為該函式中陣列所分配的空間會一直存在,直到該函...

動態記憶體分配

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