建立動態陣列(c primer)

2021-06-21 14:53:09 字數 2319 閱讀 5456

動態分配的陣列不必在編譯時知道其長度,可以(通常也是)在執行時才確定陣列長度。與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。

每乙個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區。c 語言程式使用一對標準庫函式malloc 和 free 在自由儲存區中分配儲存空間,而 c++ 語言則使用new

delete

表示式實現相同的功能。

陣列變數通過指定型別、陣列名和維數來定義。而動態分配陣列時,只需指定型別和陣列長度,不必為陣列物件命名,new 表示式返回指向新分配陣列的第乙個元素的指標:

int *pia = new int[10]; // array of 10 uninitialized

ints

此 new 表示式分配了乙個含有 10 個 int 型元素的陣列,並返回指向該陣列第乙個元素的指標,此返回值初始化了指標pia。

new 表示式需要指定指標型別以及在方括號中給出的陣列維數,該維數可以是任意的複雜表示式。建立陣列後,new 將返回指向陣列第乙個元素的指標。在自由儲存區中建立的陣列物件是沒有名字的,程式設計師只能通過其位址間接地訪問堆中的物件。

動態分配陣列時,如果陣列元素具有類型別,將使用該類的預設建構函式(第 2.3.4 節)實現初始化;如果陣列元素是內建型別,則無初始化:

string *psa = new string[10]; // array of 10 empty

strings

int *pia = new int[10]; // array of 10 uninitialized

ints

也可使用跟在陣列長度後面的一對空圓括號,對陣列元素做值初始化(第 3.3.1 節):

int *pia2 = new int[10] (); // array of 10 uninitialized

ints

如果我們在自由儲存區中建立的陣列儲存了內建型別的 const 物件,則必須為這個陣列提供初始化:因為陣列元素都是const 物件,無法賦值。實現這個要求的唯一方法是對陣列做值初始化:

// error: uninitialized

const

array

const int *pci_bad = new const int[100];

// ok: value-initialized

const

array

const int *pci_ok = new const int[100]();

c++ 允許定義類型別的 const 陣列,但該類型別必須提供預設建構函式:

// ok: array of 100 empty

strings

const string *pcs = new const string[100];

之所以要動態分配陣列,往往是由於編譯時並不知道陣列的長度。我們可以編寫如下**

size_t n = get_size(); // get_size

returns number of elements needed

int* p = new int[n];

for (int* q = p; q != p + n; ++q)

/* process the array */ ;

個人感覺這才是動態陣列的最大意義!

動態分配的記憶體最後必須進行釋放,否則,記憶體最終將會逐漸耗盡。如果不再需要使用動態建立的陣列,程式設計師必須顯式地將其占用的儲存空間返還給程式的自由儲存區。c++ 語言為指標提供delete 表示式釋放指標所指向的陣列空間:

delete  pia;

該語句**了 pia 所指向的陣列,把相應的記憶體返還給自由儲存區。在關鍵字 delete 和指標之間的空方括號對是必不可少的:它告訴編譯器該指標指向的是自由儲存區中的陣列,而並非單個物件。

if the empty bracket pair is omitted, it is an error, but an error that the compiler is unlikely to catch; the program may fail at run time.

如果遺漏了空方括號對,這是乙個編譯器無法發現的錯誤,將導致程式在執行時出錯。

理論上,**陣列時缺少空方括號對,至少會導致執行時少釋放了記憶體空間,從而產生記憶體洩漏(memory leak)。對於某些系統和/或元素型別,有可能會帶來更嚴重的執行時錯誤。因此,在釋放動態陣列時千萬別忘了方括號對。

建立動態陣列

1.動態陣列的定義 int pia new int 10 2.初始化動態的陣列 string psa new string 10 int pia new int 10 3.const物件的動態陣列 4.允許動態分配空陣列 size t n get size int p new int n 如果上述的...

動態建立陣列

在很多情況下,我們不知道所要建立陣列的大小,而是想根據需求動態的建立陣列。但是通常使用 int arr n 這樣的寫法編譯器會報錯,因為n是變數。例如以下 int n 10 int a n 對於這種情況我們可以用以下的方法解決。用到的標頭檔案 include 用到的函式 malloc sizeof ...

C 建立動態陣列

int sum 0 arraylist al new arraylist private void button1 click object sender,eventargs e while str null str string line new string al.count 1 al.copy...