Ich habe ein Programm in einem Buch
%Vor%wenn ich es auf Cygwin auf Windows 7 Maschine installiert ausführen. Ich bekomme Ausgabe
2280712 2280716 2280720 16
Warum diese Ausgabe bekomme ich? Ich habe die Ausgabe erwartet
2280712 2280720 2280721 13
A sizeof
ist immer ein Vielfaches der größten Ausrichtung, da es tatsächlich "Schritte" in Zeichen im Array eines gegebenen Typs meldet, die ein Padding zwischen Elementen enthalten, so dass zwischen Arrayelementen, die zum Ausrichten benötigt werden, ein Padding ausgeführt wird.
Das Speicherlayout von struct data
sieht folgendermaßen aus:
a
hat den Offset 0, was offensichtlich ein Vielfaches von 8 ist; ch
ist bei Offset 4, was (auch offensichtlich) ein Vielfaches von 1 ist; s
ist bei Offset 8, was ein Vielfaches von 4 ist; sizeof(struct data)
entspricht dem Offset von [1]
(16), der ein Vielfaches von max(8,1,4) = 8
sein muss
Das aligned(N)
-Attribut richtet das aktuelle -Datenelement auf eine Adresse ein, die ein Vielfaches von N
ist, indem Fülldaten vor eingefügt werden. Sie scheinen zu erwarten, dass es etwas mit dem Packen macht, was anders ist.
Ihre Struktur scheint wie folgt aufgebaut zu sein:
%Vor%aligned (8) bedeutet nur, dass die Adresse von & amp; e.a um 8 ausgerichtet wird. Und es ist (2280712). sizeof (int) ist vermutlich 4, weshalb dein Char bei 2280716 endet (er hat eine Ausrichtungsanforderung von 1, also gibt es keinen Grund dafür, dass er auf 2280720 verschoben wird). Fügen Sie einfach sizeof (int) zu Ihrer Debug-Ausgabe hinzu, um es zu überprüfen.
Sie müssen Ihre Build-Zieleinstellungen ändern, wenn Sie 64-Bit-Ints verwenden möchten.
Tags und Links c