2013-03-27 107 views
1
int length = 5; 
int hi[length]; 

VSC++這個數組的靜態和動態分配有什麼區別?

int length = 5; 
int *hi = new int[length]; 

我被教導的編譯器使用C抱怨,每當你嘗試靜態分配數組瓦特/尺寸並不是恆定的。所以,如果你需要大小未知的數組,你需要動態分配內存。但是,現在有編譯器允許第一個例子,他們究竟做了什麼?他們仍然在數據段中,還是不在堆上?如果他們在堆上,那麼這些例子之間有什麼區別,爲什麼我仍然不得不在第二個例子中調用delete [],而不是第一個例子?

+2

C編譯器不會,因爲這在C99中是合法的。 – chris 2013-03-27 03:39:49

+0

檢查http://stackoverflow.com/questions/12544796/what-is-the-difference-between-static-and-dynamic-arrays-in-c的答案 – 2013-03-27 03:47:11

+0

@ user2209441,無關的問題:你是如何評論這個的問題只有1個代表? – 2013-03-27 04:39:20

回答

2

但是,現在有編譯器允許第一個示例,它們究竟在做什麼?他們仍然在數據段中,還是不在堆上?如果他們在堆上,那麼這些例子之間有什麼區別,爲什麼我仍然不得不在第二個例子中調用delete [],而不是第一個例子?

第一種是聲明一個靜態變量(通常在堆棧*)在其所定義的代碼塊的結束,這將

第二個是動態分配一個變量(通常在堆*上),這意味着你是一個可以決定在哪裏釋放它的應用程序(並且你應該記得這樣做)。

在數組上下文中,兩者之間的主要區別在於第二個可以通過釋放指向的內存(例如前一個數組)來輕鬆調整大小,並使其指向仍然動態分配的新數組。

int* arr = new int[5]; 
[...] 
delete[] arr; 
arr = new int[10]; 

靜態數組int hi[length]通常聲明一個const int*其不應被代替修改。這就是說C++提供了一組可以/應該用來代替數組的容器。

[*] 注意:C++標準沒有指定分配動態或靜態內存的位置。

0

想必你的代碼

int length = 5; 
int hi[length]; 

是在局部範圍,而不是文件的範圍,因爲後者不會是合法的。

他們是否仍然在數據段

他們在數據段永遠也不會去;他們進入堆棧(在典型的/通用的實現中;語言標準沒有說明他們去哪裏)。

爲什麼我仍然需要在第二個示例中調用delete [],而不是第一個示例中的 ?

首先,VLA(可變長度數組,如hi[length])在C++中不合法,因此您無法調用delete []。但是不需要調用delete,因爲hi超出了它所在塊的範圍。由new(OTOH)分配的對象或數組在刪除之前不會超出範圍。只有指針hi超出範圍,但您可能已將其值分配給仍在範圍內的另一個指針。

+0

有人(可修改的左值,是你嗎?)正在經歷和低估我的答案,沒有任何評論。 – 2013-03-27 18:11:33

+0

謝謝,爲我解決了:) – Popcorn 2013-03-27 21:01:41

相關問題