一、對於普通陣列來說,在定義或初始化時必須確定元素個數,即下標必須是已知的,即在編譯時已知。
例:定義陣列時 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來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...