2008-09-08 8 views
15

Warum ist n ungleich 8 in der folgenden Funktion?Unterschiedliche Größe der Ergebnisse

void foo(char cvalue[8]) 
{ 
    int n = sizeof (cvalue); 
} 

Aber ntut gleich 8 in dieser Version der Funktion:

void bar() 
{ 
    char cvalue[8]; 
    int n = sizeof (cvalue); 
} 

Antwort

45

Weil Sie nicht ganze Arrays als Funktionsparameter in C. Sie vorbei einen Zeiger tatsächlich passieren kann dazu; die Klammern sind syntaktischer Zucker. Es gibt keine Garantie dafür, dass das Array, auf das Sie zeigen, die Größe 8 hat, da Sie dieser Funktion einen beliebigen Zeichenzeiger übergeben können.

// These all do the same thing 
void foo(char cvalue[8]) 
void foo(char cvalue[]) 
void foo(char *cvalue) 
+3

mehr wie syntaktische Cyanid ... –

1

Im ersten Beispiel cValue als übergebene Parameter ist wirklich nur in einem Zeiger auf ein Zeichen-Array und wenn Sie die sizeof() davon nehmen, können Sie die Größe des Zeigers erhalten. Im zweiten Fall, in dem Sie es als lokale Variable deklariert haben, erhalten Sie die Größe des gesamten Arrays.

0

Die Größe des Parameters auf 32-Bit-Systemen wird 4 sein und auf 64-Bit-Systemen, die mit -m64 kompiliert werden, ist 8. Dies liegt daran, dass Arrays als Zeiger in Funktionen übergeben werden. Der Zeiger ist lediglich eine Speicheradresse.

14

C- und C++ - Arrays sind keine Objekte der ersten Klasse. Sie können Arrays nicht an Funktionen übergeben, sie verfallen immer zu Zeigern.

Sie können jedoch Zeiger und Referenzen auf Arrays übergeben. Dies verhindert, dass die Array-Grenzen abfallen. Also das ist legal:

template<typename T, size_t N> 
void foo(const T(&arr)[N]) 
{ 
    int n = sizeof(arr); 
} 
+2

Sie verdienen mehr Upmods für Ihre clevere Lösung. –

+1

@NickRetallack zustimmen – Ulterior

+0

Beachten Sie, dass das Vorlagenbeispiel C++ und nicht C ist. C unterstützt keine Referenztypen. – Peter