Ergebnis von sizeof für C++-Arrays und -Zeiger

Ergebnis von sizeof für C++-Arrays und -Zeiger

z ist kein Zeiger. Daher sizeof(z) ist nichts, aber 5 Bytes. Im Fall von sizeof , zerfällt das Array nicht zum Zeiger. Siehe:Was ist Array Decay?

Es gibt mehrere implizite Konvertierungen in C++ wie Array zu Zeiger, Enum zu Integer, double bis float , abgeleitet von base, ein beliebiger Zeiger auf void* usw. Was uns dazu bringen könnte zu denken, ob ihre Größen gleich sind oder was?
Daher besteht ein Lackmustest für das Selbstverständnis darin, eine Zeigerreferenz zu erstellen und zu versuchen, den anderen Typ zuzuweisen. Es führt zu Fehlern bei nicht übereinstimmenden Typen. z. B.

int *x = new int[5], *&px = x; // OK
int z[5], *&pz = z; // error: can't initialize

Sie haben x definiert als Zeiger auf char, also sizeof(x) liefert die Größe eines Zeigers auf char. Bei einer aktuellen Implementierung sind das normalerweise entweder 32 Bit oder 64 Bit. Ein char ist normalerweise 8 Bit, also können Sie sizeof(char *) erwarten auf den meisten aktuellen Compilern 4 oder 8 ergeben.

Sie haben z definiert als Array von 5 Zeichen, also sizeof(z) ergibt die Größe eines Arrays von 5 Zeichen. Da die Elemente eines Arrays zusammenhängend sind, und sizeof(char) garantiert 1 ist, wäre der offensichtliche Wert dafür 5.

Wenn Sie (zum Beispiel) ein Array von 5 Zeichen in eine Struktur einfügen und darauf folgt (sagen wir) ein int , besteht eine sehr gute Chance, dass der Compiler eine Auffüllung zwischen diesen beiden Elementen einfügt.