Namespaces
Variants

offsetof

From cppreference.net
< c ‎ | types
Definiert im Header <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

Das Makro offsetof expandiert zu einem Integer-Konstantenausdruck vom Typ size_t , dessen Wert das Offset in Bytes vom Anfang eines Objekts des angegebenen Typs zu seinem angegebenen Unterobjekt ist, einschließlich eventueller Auffüllbytes.

Gegeben ein Objekt o vom Typ type mit statischer Speicherdauer, & ( o. member ) muss ein Adresskonstantenausdruck sein und auf ein Unterobjekt von o zeigen. Andernfalls ist das Verhalten undefiniert.

Wenn der in type angegebene Typname ein Komma enthält, das nicht zwischen übereinstimmenden Klammern steht, ist das Verhalten undefiniert.

(since C23)

Inhaltsverzeichnis

Hinweise

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

member ist nicht auf ein direktes Mitglied beschränkt. Es kann ein Unterobjekt eines bestimmten Mitglieds bezeichnen, wie beispielsweise ein Element eines Array-Mitglieds.

Obwohl in C23 spezifiziert ist, dass die Angabe eines neuen Typs mit einem nicht eingeklammerten Komma in offsetof undefiniertes Verhalten darstellt, wird eine solche Verwendung generell selbst in früheren Modi nicht unterstützt: offsetof ( struct Foo { int a, b ; } , a ) führt generell zu einem Kompilierungsfehler.

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

(seit C23)

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

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
DR 496 C89 nur Structs und Struct-Member wurden erwähnt Unions und andere Subobjekte werden ebenfalls unterstützt

Siehe auch

Vorzeichenloser Ganzzahltyp, zurückgegeben durch den sizeof Operator
(typedef)
C++-Dokumentation für offsetof