3 Stimmen

Sind die Pad-Längen für jedes Element in einer Struktur unterschiedlich?

Mögliches Duplikat:
Inkonsistenz der C-Strukturgrößen

Für das folgende Programm möchte ich die Größe einer Struktur ermitteln. Es stellt sich jedoch heraus, dass die Größe der Struktur 12 ist und nicht 4*4=16 . Bedeutet dies, dass jedes Element auf eine andere Pad-Nummer ausgerichtet werden kann? int mit 4 und short mit 2, aber in diesem Fall sollte char 1 haben.

Vielen Dank.

#include <stdio.h>

struct test{
int a;
char b;
short c;
int d;

};

struct test A={1,2,3,4};

int main()
{

    printf("0X%08X\n",&A.a);
    printf("0X%08X\n",&A.b);
    printf("0X%08X\n",&A.c);
    printf("0X%08X\n",&A.d);
    printf("%d\n",sizeof(A));

}

Und das Ergebnis ist:

0X00424A30
0X00424A34
0X00424A36
0X00424A38
12

1voto

md5 Punkte 23267

Ja, nicht jeder Typ hat die gleiche Ausrichtung. Jede Ihrer Variablen muss korrekt ausgerichtet sein, d.h. ihre Adressen müssen ein Vielfaches einer bestimmten Größe sein. Die übliche Regel (u.a. für Intel und AMD) ist, dass jeder Datentyp an seiner eigenen Größe ausgerichtet ist. Geht man von der x86-Architektur aus, so scheint sie hier richtig zu sein:

  • 0X00424A30 erste Adresse der Struktur.
  • 0X00424A34 : 4 Bytes (vielleicht sizeof(int) ) nach dem ersten Mitglied. char erfordert einen Abgleich von 1 und braucht daher hier nicht aufgefüllt zu werden.
  • 0X00424A36 2 Bytes nach dem zweiten Glied. short erfordert eine Ausrichtung von 2, so dass 1 Byte Füllung vorhanden ist.
  • 0X00424A38 2 Bytes nach dem zweiten Glied. int erfordert eine Ausrichtung von 4, aber die Adresse ist bereits ein Vielfaches von 4. Es gibt also kein Auffüllbyte.

Auf jeden Fall ist es keine tragbare Annahme: Der C-Standard erzwingt hier nichts. Er erlaubt nur das Auffüllen von Bytes zwischen den Elementen und am Ende der Struktur.

Übrigens sollten Sie lieber die folgenden Formate verwenden:

  • %p und Typecast für Zeiger;
  • %zu o %u mit Typisierung für sizeof .

1voto

che Punkte 11861

Ja. Beachten Sie, dass die Auffüllung von der Implementierung abhängt, so dass sie auf verschiedenen Plattformen unterschiedlich ausfallen kann. C99-Spezifikation In Abschnitt 6.7.2.1 heißt es lediglich, dass zwischen den Gliedern der Struktur und an deren Ende Auffüllungen möglich sind. Um portable Programme zu erstellen, sollten Sie keine Annahmen über die Länge der Auffüllungen machen.

1voto

Ja, jeder Typ hat seine eigenen Ausrichtungsbeschränkungen.

Die Ausrichtungsbeschränkungen des Typs T kann niemals strenger sein als die Forderung nach Ausrichtung auf Adressen, die ein Vielfaches von sizeof(T) als die beiden Elemente des Arrays T arr[2] müssen unmittelbar aufeinander folgen, ohne zusätzliche Füllung, damit arr[1] korrekt ausgerichtet. Es ist zulässig, dass ein Compiler weniger strenge Ausrichtungsanforderungen verwendet.

Zum Beispiel,

  • a char Objekt muss byte-aligned sein (wie sizeof(char) == 1 per Definition)
  • a short Objekt wird in der Regel an zwei Bytes ausgerichtet sein (mit sizeof(short) == 2 ), könnte aber auf einigen Architekturen auch byte-aligned sein
  • a int Objekt wird in der Regel mit vier Bytes ausgerichtet (mit sizeof(int) == 4 ), könnte aber auf einigen Architekturen auch zwei oder sogar ein Byte ausgerichtet sein
  • a struct Typ erfordert in der Regel eine Ausrichtung, die den Ausrichtungsanforderungen des am strengsten ausgerichteten Typs unter seinen Mitgliedern entspricht (manchmal mit einer Mindestausrichtung > 1).

Bei der Erstellung einer Struktur müssen alle Elemente relativ zum Anfang der Struktur korrekt ausgerichtet sein, wobei das erste Element den Offset 0 haben muss. Um dies zu erreichen, muss der Compiler möglicherweise nach einem Element ein Padding einfügen, um das nächste Element korrekt auszurichten.

0voto

Ravindra Bagale Punkte 16695

Ja .wegen Packing and byte alignment Die allgemeine Antwort lautet, dass compilers are free to add padding between members for alignment purpose .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X