2012-04-20 23 views
8

0 elemanlı bir dizi, ayrılmamış bir işaretçi ile aynı mı?0 elemanlı diziler

int arr[0];int* arr; ile aynı mı?

Düzenleme: Ben buna benzer bir şey yaptıysam Ne:

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

Bu kodu çalıştı ve bu derlenmiş. Bilgime, hem x hem de arr bellekte aynı yere işaret etmelidir. Bu davadaki fark ne olurdu?

+1

İşaretçi her zaman yeni bir şeye işaret edebilir, oysa bir dizi statik olarak tanımlanır. – chrisaycock

cevap

13

Hiç de değil.

Hata durumunda [0], arr iyi tanımlanmış bir adrese sahiptir.

* Hata durumunda, arr henüz başlatılmamış.

Eğer hemen önce tanımlanmış bir dizi arr const başlatmak için EDIT'e, sonra : sadece değişkenlerin içeriğinde hiçbir fark yoktur olurdu, ama eylemlerde onlara gerçekleştirmek için izin verilecek .

+0

int * const arr nedir? – Dasaru

+0

@Dasaru Denedin mi? Bu derleme yapmıyor… –

+0

@Dasaru: normalde yapabilirdiniz ... ancak normalde ** arr ** öğesini belirli bir bellek konumuna manuel olarak başlatmanız gerekir. Http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-the-constructor-initializer-rather-than –

0

Sıfır uzunluklu bir dizi, dizinin başlangıcına, belirli bir adrese işaret eder. Dizinin sonundan sonra, tanımlanmamış verilere sahip olacaksınız, bu durumda, adresin işaret ettiği adreste. Bu kullanışlıdır

int arr[0]; 
int* ptr; 

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

bir yolu: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

Bildiğim kadarıyla, bu kullanımın aslında standarda göre yasal olup olmadığı konusunda bir fikir birliği yoktur, çünkü sınırlar dışındaki dizi erişimi basitçe UB'dir (ve * yazım hatalarına neden olur, bu sadece bir varsayımsal değildir). –

+0

@KonradRudolph C90'da hiçbir soru yoktu: 'int arr [0]' bir yapı dahil olmak üzere yasadışıydı. Ve dizinin 'int arr [1];' olarak bildirilmiş olması ve indeks 2 ile erişilmiş olsaydı, tanımlanmamış bir davranış olduğu açıktı. C99 (ancak C++ değil), bir yapının son üyesini bu kullanımı desteklemek için "int arr [];" olarak bildirebilirsiniz (ancak int arr [0]; 'bir hata olarak kalır). –

+0

@James Ah, öyleydi. Peki ya C++? Sınır dışı dizi erişiminin asla yasal olmadığından eminim, haklı mıyım? –

4

bir yerel olarak ayrılmamış bir işaretçi olarak aynı değildir, böylece sıfır uzunluklu dizisi C++ illegal amaç edinmiştir.