Namensräume
Varianten
Aktionen

offsetof

Von cppreference.com
< c‎ | types
Definiert im Header <stddef.h>
#define offsetof(type, member) /*implementationsspezifisch*/

Das Makro offsetof erweitert sich zu einem ganzzahligen konstanten Ausdruck vom Typ size_t, dessen Wert der Offset in Bytes vom Anfang eines Objekts vom angegebenen Typ zu seinem angegebenen Unterobjekt ist, einschließlich etwaiger Auffüllungen (Padding).

Gegeben sei ein Objekt o vom Typ type mit statischer Speicherdauer. Dann muss &(o.member) ein Adresskonstanten-Ausdruck sein und auf ein Unterobjekt von o zeigen. Andernfalls ist das Verhalten undefiniert.

Wenn der in type angegebene Typname ein Komma enthält, das sich nicht zwischen passenden Klammern befindet, ist das Verhalten undefiniert.

(seit C23)

Inhalt

[bearbeiten] Hinweise

Wenn offsetof auf ein Bitfeld-Mitglied angewendet wird, ist das Verhalten undefiniert, da die Adresse eines Bitfeldes nicht genommen werden kann.

member muss kein direktes Mitglied sein. Es kann sich auf ein Unterobjekt eines gegebenen Mitglieds beziehen, wie z.B. ein Element eines Array-Mitglieds.

Obwohl in C23 festgelegt ist, dass die Angabe eines neuen Typs, der ein nicht in Klammern gesetztes Komma in offsetof enthält, undefiniertes Verhalten darstellt, wird eine solche Verwendung im Allgemeinen auch in früheren Modi nicht unterstützt: offsetof(struct Foo { int a, b; }, a) schlägt in der Regel beim Kompilieren fehl.

typeof kann verwendet werden, um die negativen Auswirkungen von Kommas bei der Definition eines neuen Typs zu vermeiden, z.B. ist offsetof(typeof(struct { int i, j; }), i) wohldefiniert.

(seit C23)

[bearbeiten] Beispiel

#include <stdio.h>
#include <stddef.h>
 
struct S {
    char c;
    double d;
};
 
int main(void)
{
    printf("the first element is at offset %zu\n", offsetof(struct S, c));
    printf("the double is at offset %zu\n", offsetof(struct S, d));
}

Mögliche Ausgabe

the first element is at offset 0
the double is at offset 8

[bearbeiten] Fehlerberichte

Die folgenden verhaltensändernden Defect Reports wurden rückwirkend auf zuvor veröffentlichte C-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
DR 496 C89 nur Strukturen und Strukturmitglieder wurden erwähnt unions und andere Unterobjekte werden ebenfalls unterstützt

[bearbeiten] Siehe auch

vorzeichenloser Ganzzahltyp, der vom Operator sizeof zurückgegeben wird
(typedef) [bearbeiten]
C++ Dokumentation für offsetof