typestar

offsetof y disposición en C

offsetof reporta dónde queda un miembro; así funcionan los contenedores intrusivos.

#include <stddef.h>
#include <stdio.h>

typedef struct {
    int id;
    char label[8];
    double score;
} Record;

#define CONTAINER_OF(ptr, type, member) \
    ((type *) ((char *) (ptr) - offsetof(type, member)))

void layout(void) {
    Record r = {7, "step", 91.5};
    double *score = &r.score;
    Record *back = CONTAINER_OF(score, Record, score);

    printf("%zu %zu %zu\n", offsetof(Record, id),
           offsetof(Record, label), offsetof(Record, score));
    printf("recovered id %d\n", back->id);
}

Cómo funciona

  1. Produce un desplazamiento en bytes como size_t desde el inicio del struct.
  2. Restarlo de la dirección de un miembro recupera el struct.
  3. Ese es el truco detrás de la macro container_of.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
21
Caracteres a escribir
466
Tokens
111
Ritmo de tres estrellas
100 tpm

Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 67 segundos.

Escribe este fragmento

Paso 4 de 5 en Uniones y disposición; paso 4 de 13 en Uniones, campos de bits y comportamiento indefinido.

← Anterior Siguiente →