2012-04-20 67 views
8

是一個具有0個元素的數組,它與未分配的指針相同嗎?具有0個元素的數組

int arr[0];是否與int* arr;相同?

編輯:如果我做了一些與此類似:

int x[0]; 
int* const arr = x; 

我想這個代碼,它編譯。據我所知,x和arr都應該指向內存中的相同位置。這種情況會有什麼不同?

+1

指針總是可以指向新的東西,而數組是靜態定義的。 – chrisaycock 2012-04-20 15:17:00

回答

13

根本不是。

在arr [0]的情況下,arr具有明確的地址。

在* arr的情況下,arr只是未初始化。

你的編輯,在那裏你之前定義的數組初始化常量ARR後:有也只是在變量的內容沒有區別,但在行動,你將被允許對它們執行。

+0

int * const arr怎麼樣? – Dasaru 2012-04-20 15:18:29

+0

@達斯魯你試過了嗎?這不會編譯... – 2012-04-20 15:19:38

+0

@Dasaru:通常你可以...但你必須手動初始化** arr **到給定的內存位置,因爲它是const。看看http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-the-constructor-initializer-rather-than – 2012-04-20 15:27:34

0

零長度數組指向特定地址,即數組的起始位置。在數組結束後,您將在未指定的數據處指向該地址。這是有用的

int arr[0]; 
int* ptr; 

// arr is a reliable value; 
// *arr is not; 
// ptr is not; 

一種方式:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

據我所知,關於這個用法是否實際上是合法的,根據標準還沒有達成共識,因爲超出範圍的數組訪問僅僅是UB(並且*會導致軟件中的錯誤,這不僅僅是一個假設)。 – 2012-04-20 15:37:32

+0

@KonradRudolph在C90中,毫無疑問:'int arr [0]'是非法的,包括在一個結構中。很明顯,如果數組被聲明爲'int arr [1];',並且您使用和索引2進行訪問,則它是未定義的行爲。 C99(但不是C++),你可以聲明struct的最後一個成員爲'int arr [];'來支持這個用法(但是'int arr [0];'仍然是一個錯誤)。 – 2012-04-20 16:58:53

+0

@詹姆斯啊,就是這樣。那麼C++呢?我非常肯定,出界數組訪問從來都不合法,對吧? – 2012-04-20 18:30:34

4

甲局部聲明零長度的數組在C++非法所以它不是一樣的未分配指針。

相關問題