2013-02-21 7 views
10

Meine Frage ist, wie genau sizeof() verhält, wenn übergeben Argument ist ein dynamisches Array variabler Länge Array.Verhalten der sizeof auf Arrays mit variabler Länge (nur C)

Nehmen wir ein Beispiel betrachten:

int fun(int num_of_chars) 
{ 
    char name_arr[num_of_chars] = {0}; 

    /* Do something*/ 

    return sizeof(name_arr); 
} 

In diesem Beispiel ist es offensichtlich, dass Rückgabewert kein Kompilierung konstant ist. Die Größe hängt vom Laufzeitwert num_of_chars ab.

Ein Zitat aus C99-Standard (6.5.3.4):

sizeof Der Operator liefert die Größe (in Bytes) den Operanden, der eine Expression oder der geklammerten Name eines Typs sein kann. Die Größe wird aus dem Operanden des Operanden ermittelt. Das Ergebnis ist eine ganze Zahl. Wenn der Typ des Operanden ein Array-Typ variabler Länge ist, wird der Operand ausgewertet; Andernfalls wird der Operand nicht ausgewertet und das Ergebnis ist eine Ganzzahlkonstante.

Was kann ich verstehen, von [.... der Operand ausgewertet wird ....], dass, wenn das für sizeof() gebene Argument ist eine dynamischer Array variabler Länge Array, sizeof() ‚verhält sich wie‘ ein Funktion und nicht als Operator.

Ist mein Verständnis richtig?

+0

'sizeof()' ist immer noch ein Operator; Es generiert nur keine Kompilierzeitkonstante mehr, wenn das Argument ein Array variabler Länge ist. –

+0

kompiliert Ihr Code? Ich bekomme ein 'Variable-Size-Objekt möglicherweise nicht initialisiert' Fehler –

Antwort

6

Es verhält sich immer noch wie ein Operator. Cast ist auch Operator und wertet auch sein Argument aus und tut dies auch * oder &. Operator zu sein ist eine syntaktische Kategorie. Das ändert sich nicht.

Der wichtige Unterschied ist, dass es verhält sich wie Ausdruck während in anderen Fällen verhält es sich wie konstant.


Update: Ich unter dem kommentierten ich sehe nicht, warum die Auswertung Unterschied macht, aber jetzt wurde mir klar, es gibt zwei Möglichkeiten, wie Sie sizeof mit variabler Länge Array zu schreiben. Entweder können Sie Variable deklariert als variable Länge Array übergeben:

int a[x]; 
sizeof(a) 

wobei in diesem Fall die Bewertung a in der Tat keinen Unterschied macht. Sie können aber auch einen Typ als Argument verwenden, die

sizeof(int[x]) 

und in diesem Fall wäre das Ergebnis x * sizeof(int) und x müssen ausgewertet werden. Ich nehme an, warum die Spezifikation es erwähnt.

+0

" und wertet auch sein Argument "- nein, tut es nicht. Der an 'sizeof() 'übergebene Ausdruck wird nicht ausgewertet. –

+1

@ H2CO3: Bitte lesen Sie die Frage. Sie gibt an, dass der Operand ausgewertet wird, wenn es sich um ein Array variabler Länge handelt. Das heißt, der einzige Ausdruck des Array-Typs mit variabler Länge in C99 ist so deklariert und bewertet, dass er keinen beobachtbaren Effekt hat. Daher bin ich nicht sicher, warum die Unterscheidung gemacht wird (C++ ist eine andere Sache, aber selbst C++ 11 enthält dies nicht Feature). –

+1

@ H2CO3: In der Tat habe ich jetzt festgestellt, dass, wenn Sie eine Variable Länge Array _Type_ zu "sizeof" übergeben, der Ausdruck ausgewertet wird und mit möglicherweise beobachtbaren Nebenwirkungen. Die Antwort wurde aktualisiert. –

4

Meine Frage ist, wie genau sich sizeof() verhält, wenn das übergebene Argument ein dynamisches Array ist.

  1. Nun, gemeint Sie lieber eine "variabler Länge Array" (VLA).

  2. Es verhält sich fast genau gleich: Es gibt die Größe des Arrays in Bytes zurück.

sizeof() verhält sich wie "Funktion und nicht als Operator.

Nein, es war nie eine Funktion. Die einzige Sache, die sich ändert, ist, dass dieser Operator, wenn er auf VLAs verwendet wird, keine Kompilierzeitkonstante ergibt, anderenfalls wird er ausgeführt.

+0

Grund für den Downvote? –

+1

Weil einige Leute hier frustriert sind. –