2012-04-20 10 views
8

Ist ein Array mit 0 Elementen dasselbe wie ein nicht zugeordneter Zeiger?Arrays mit 0 Elementen

Ist int arr[0]; das gleiche wie int* arr;?

Edit: Was passiert, wenn ich etwas ähnliches wie dies tat:

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

ich diesen Code versucht, und es kompiliert. Nach meinem Wissen sollten sowohl x als auch arr auf den gleichen Speicherort im Speicher zeigen. Was wäre der Unterschied in diesem Fall?

+1

Ein Zeiger kann immer auf etwas Neues zeigen, während ein Array statisch definiert ist. – chrisaycock

Antwort

13

Überhaupt nicht.

Im Fall von arr [0], arr hat eine gut definierte Adresse.

Im Fall von * arr, arr ist nur nicht initialisiert.

nach dem EDIT, wo Sie die const arr mit einem Array initialisieren definiert kurz vor: Es wäre einfach kein Unterschied im Inhalt der Variablen sein, aber in den Aktionen würden Sie erlaubt werden, auf sie auszuführen .

+0

Was ist mit int * const arr? – Dasaru

+0

@Dasaru Hast du es versucht? Das kompiliert nicht ... –

+0

@Dasaru: Normalerweise könnte man ... aber Sie müssten manuell den ** arr ** auf einen bestimmten Speicherort initialisieren, da es const ist. Werfen Sie einen Blick auf http://stackoverflow.com/questions/355258/why-must-const-members-be- intialized-in-the-constructor-initializer-rather-than –

0

Ein Array der Länge Null zeigt auf eine bestimmte Adresse, den Anfang des Arrays. Nach dem Ende des Arrays haben Sie undefinierte Daten, in diesem Fall an der Adresse, auf die verwiesen wird.

int arr[0]; 
int* ptr; 

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

Ein Weg, dies nützlich: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

+0

Soweit ich weiß gibt es noch keinen Konsens darüber, ob diese Verwendung tatsächlich legal ist, da der Array-Zugriff außerhalb der Grenzen einfach UB ist (und * verursacht * Fehler in der Software, Dies ist nicht nur eine hypothetische). –

+0

@KonradRudolph In C90 gab es keine Frage: 'int arr [0]' war illegal, einschließlich in einer Struktur. Und es war klar, dass, wenn das Array mit int int arr [1]; 'deklariert wurde und Sie mit und index 2 darauf zugegriffen haben, das Verhalten nicht definiert war. C99 (aber nicht C++), können Sie das letzte Mitglied einer Struktur als 'int arr [];' deklarieren, um diese Verwendung zu unterstützen (aber 'int arr [0];' bleibt ein Fehler). –

+0

@James Ah, das war es. Was ist mit C++? Ich bin mir ziemlich sicher, dass Out-of-Bounds-Array-Zugriff niemals legal war, habe ich recht? –

4

A lokal deklarierte Länge Null Array in C++ illegal ist, so dass es nicht das gleiche wie ein nicht zugewiesenen Zeiger ist.

Verwandte Themen