是一個具有0個元素的數組,它與未分配的指針相同嗎?具有0個元素的數組
是int arr[0];
是否與int* arr;
相同?
編輯:如果我做了一些與此類似:
int x[0];
int* const arr = x;
我想這個代碼,它編譯。據我所知,x和arr都應該指向內存中的相同位置。這種情況會有什麼不同?
是一個具有0個元素的數組,它與未分配的指針相同嗎?具有0個元素的數組
是int arr[0];
是否與int* arr;
相同?
編輯:如果我做了一些與此類似:
int x[0];
int* const arr = x;
我想這個代碼,它編譯。據我所知,x和arr都應該指向內存中的相同位置。這種情況會有什麼不同?
根本不是。
在arr [0]的情況下,arr具有明確的地址。
在* arr的情況下,arr只是未初始化。
你的編輯,在那裏你之前定義的數組初始化常量ARR後:有也只是在變量的內容沒有區別,但在行動,你將被允許對它們執行。
int * const arr怎麼樣? – Dasaru 2012-04-20 15:18:29
@達斯魯你試過了嗎?這不會編譯... – 2012-04-20 15:19:38
@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
零長度數組指向特定地址,即數組的起始位置。在數組結束後,您將在未指定的數據處指向該地址。這是有用的
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
據我所知,關於這個用法是否實際上是合法的,根據標準還沒有達成共識,因爲超出範圍的數組訪問僅僅是UB(並且*會導致軟件中的錯誤,這不僅僅是一個假設)。 – 2012-04-20 15:37:32
@KonradRudolph在C90中,毫無疑問:'int arr [0]'是非法的,包括在一個結構中。很明顯,如果數組被聲明爲'int arr [1];',並且您使用和索引2進行訪問,則它是未定義的行爲。 C99(但不是C++),你可以聲明struct的最後一個成員爲'int arr [];'來支持這個用法(但是'int arr [0];'仍然是一個錯誤)。 – 2012-04-20 16:58:53
@詹姆斯啊,就是這樣。那麼C++呢?我非常肯定,出界數組訪問從來都不合法,對吧? – 2012-04-20 18:30:34
甲局部聲明零長度的數組在C++非法所以它不是一樣的未分配指針。
指針總是可以指向新的東西,而數組是靜態定義的。 – chrisaycock 2012-04-20 15:17:00