12 Stimmen

Kraftspezifische Strukturgröße in C

Aus verschiedenen Gründen habe ich einige Strukturen, die ich erzwingen möchte, um bestimmte Größen (in diesem Fall 64 Byte und 512 Byte) sein. Beide sind jedoch unterhalb der etwas unterhalb der Größen, die ich will, dass sie sein.

Gibt es irgendwie für mich, den Compiler zu sagen, um Sie zu diesen spezifischen Größen und Pad mit Nullen zu setzen, oder wäre ich am besten aus nur deklarieren ein Array innerhalb der Struktur, die den überschüssigen Platz macht, so dass es auf die Größe ausrichtet, die ich will?

23voto

Dietrich Epp Punkte 193178

Sie können eine Gewerkschaft verwenden.

struct mystruct_s {
    ... /* who knows how long */
};

typedef union {
    struct mystruct_s s;
    unsigned char padding[512];
} mystruct;

Damit wird sichergestellt, dass die Vereinigung mindestens 512 Byte groß ist. Dann können Sie mit einer statischen Assertion irgendwo in Ihrem Code sicherstellen, dass es nicht mehr als 512 Bytes sind:

/* Causes a compiler error if sizeof(mystruct) != 512 */
char array[sizeof(mystruct) != 512 ? -1 : 1];

Wenn Sie C11 verwenden, gibt es eine bessere Möglichkeit, dies zu tun. Ich kenne noch niemanden, der C11 verwendet. Der Standard wurde erst vor wenigen Wochen veröffentlicht.

_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes");

Beachten Sie, dass die einzige Möglichkeit zum Auffüllen mit Nullen ist es, die Nullen dort manuell zu setzen ( calloc o memset ). Der Compiler ignoriert Auffüllungsbytes.

1voto

Lorenzo Pistone Punkte 4858

Ich glaube nicht, dass es eine Möglichkeit gibt, dies zu automatisieren, zumindest in gcc, der der Compiler ist, den ich verwende. Sie müssen Ihre structs auffüllen.

Seien Sie vorsichtig mit automatische Ausrichtung von Variablen in Ihrer Struktur. Zum Beispiel struct beispiel{ char a; int b; }

benötigt nicht 5, sondern 8 Bytes.

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