Sizeof Pointer to Array

8

Wenn ich ein Array wie folgt deklariert habe:

%Vor%

warum ist das dann:

%Vor%

während:

%Vor%

Ich verstehe nicht, wie das Hinzufügen von 0 zum Zeiger die sizeof -Ausgabe ändert. Gibt es vielleicht eine implizite Art Besetzung?

    
user695652 13.10.2011, 19:03
quelle

2 Antworten

12

Wenn Sie 0 zu a hinzufügen, wird a zuerst in einen Zeigerwert vom Typ int(*)[2] konvertiert (der auf das erste Element eines Arrays vom Typ int[3][2] verweist). Dann wird 0 hinzugefügt, was 0 * sizeof(int[2]) bytes zu der durch diesen Zeigerwert repräsentierten Adresse addiert. Da diese Multiplikation 0 ergibt, wird derselbe Zeigerwert erhalten. Da es sich um einen Zeiger handelt, liefert sizeof(a+0) die Größe eines Zeigers, der auf Ihrer Box 8 Bytes beträgt.

Wenn Sie sizeof(a) eingeben, gibt es keinen Grund für den Compiler, a in einen Zeigerwert zu konvertieren (was nur Sinn macht, wenn Sie Elemente indexieren oder Zeigerarithmetik mit der Adresse der Elemente ausführen wollen). Der Ausdruck a bleibt also ein Array-Typ und Sie erhalten die Größe von int[3][2] statt der Größe von int(*)[2] . Also, 3 * 2 * sizeof(int) was auf deiner Box 24 Bytes ist.

Hoffe das klärt die Dinge.

    
Johannes Schaub - litb 13.10.2011, 19:07
quelle
0

sizeof sagt Ihnen die Größe des Typs des Ausdrucks. Wenn Sie 0 zu a hinzufügen, wird der Typ zu einem Zeiger (8 Byte auf 64-Bit-Systemen).

    
Lou Franco 13.10.2011 19:07
quelle

Tags und Links