2012-04-20 32 views
8

Czy tablica z 0 elementami jest taka sama, jak nieprzydzielony wskaźnik?Tablice z 0 elementami

Czy int arr[0]; jest takie samo jak int* arr;?

Edycja: Co jeśli zrobiłem coś podobnego do tego:

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

Próbowałem ten kod i skompilowany. Zgodnie z moją wiedzą zarówno x, jak i arr powinny wskazywać na to samo miejsce w pamięci. Jaka byłaby różnica w tym przypadku?

+1

Wskaźnik może zawsze wskazywać na coś nowego, podczas gdy tablica jest zdefiniowana statycznie. – chrisaycock

Odpowiedz

13

Wcale nie.

W przypadku arr [0], arr ma dobrze zdefiniowany adres.

W przypadku * arr, arr jest po prostu niezainicjowany.

Po EDIT, gdzie zainicjować const arr z tablicy zdefiniowanej tuż przed: tam po prostu być żadnej różnicy w zawartości zmiennych, ale w działaniach można byłoby wolno wykonywać na nich .

+0

Co z int * const arr? – Dasaru

+0

@Dasaru Spróbowałeś? To się nie komplikuje ... –

+0

@Dasaru: normalnie mógłbyś ... ale musiałbyś ręcznie zainicjować ** arr ** do danej lokalizacji pamięci, ponieważ jest to const. Spójrz na http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-tstructor-initializer-rather-than –

0

Tablica o zerowej długości wskazuje na konkretny adres, początek tablicy. Po zakończeniu tablicy będziesz mieć niezdefiniowane dane, w tym przypadku pod wskazanym adresem.

int arr[0]; 
int* ptr; 

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

Jednym ze sposobów jest to przydatne: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

O ile mi wiadomo, nadal nie ma zgody co do tego, czy to użycie jest zgodne z normą, ponieważ dostęp do tablicy poza granicami jest po prostu UB (i * powoduje * błędy w oprogramowaniu, nie jest to tylko hipotetyczne). –

+0

@KonradRudolph W C90 nie było mowy: 'int arr [0]' było nielegalne, włączając w to strukturę. I stało się jasne, że jeśli tablica została zadeklarowana jako "int arr [1];", a ty uzyskałeś dostęp i indeks 2, było to niezdefiniowane zachowanie. C99 (ale nie C++), możesz zadeklarować ostatniego członka struktury jako 'int arr [];' aby obsłużyć to użycie (ale 'int arr [0];' pozostaje błędem). –

+0

@ James Ah, to było to. A co z C++? Jestem prawie pewien, że dostęp do tablicy poza granicami nigdy nie był legalny, mam rację? –

4

Lokalnie zadeklarował zerową długość tablicy jest nielegalne w C++, więc to nie jest takie samo jak nieprzydzielone wskaźnika.