¿Los campos de estructura no mencionados * siempre * se inicializan a cero (es decir, cuando la estructura está en la pila)?

De la experimentación (en Clang y GCC, con -O2 y -O0) esparece que en el siguiente código

typedef struct foo_s { int i; int j; } foo_t;
int main(void) {
    foo_t foo = {.i = 42};
    ...

foo.j es automáticamente cero.

¿Está garantizado por C99 en adelante, o es un detalle de implementación específico del compilador?

Nota: Incluso he intentado escribir 0xFFs en la memoria no válida debajo de la pila, en la dirección que foo se da más tarde.

Actualización: hay un par de comentarios que indican que esto se debe a que la memoria debajo de la pila contiene ceros. El siguiente código asegura que este no sea el caso, y puede probar que GCC -O0 está poniendo a cero la memoria.

Las compensaciones de -7 y -6 dependen del compilador. Necesitaban ser diferentes en Clang.

typedef struct foo_s { int i; int j; } foo_t;

int main(void) {
    int r;
    int *badstack0 = &r - 7;
    int *badstack1 = &r - 6;

    *badstack0 = 0xFF; // write to invalid ram, below stack
    printf("badstack0 %p, val: %2X\n", badstack0, *badstack0);
    *badstack1 = 0xEE; // write to invalid ram, below stack
    printf("badstack1 %p, val: %2X\n", badstack1, *badstack1);

    // struct test
    foo_t foo = {.i = 42};
    printf("&foo.i %p\n", &foo.i);
    printf("&foo.j %p\n", &foo.j);
    printf("struct test: i:%i j:%i\n", foo.i, foo.j);
    return 0;
}

Salida:

badstack0 0x7fff221e2e80, val: FF
badstack1 0x7fff221e2e84, val: EE
&foo.i 0x7fff221e2e80
&foo.j 0x7fff221e2e84
struct test: i:42 j:0

Respuestas a la pregunta(2)

Su respuesta a la pregunta