¿Está bien acceder más allá del tamaño de una estructura a través de la dirección de miembro, con suficiente espacio asignado?

Específicamente, es el siguiente código, la línea debajo del marcador, ¿de acuerdo?

struct S{
    int a;
};

#include <stdlib.h>

int main(){
    struct S *p;
    p = malloc(sizeof(struct S) + 1000);
    // This line:
    *(&(p->a) + 1) = 0;
}

La gente ha discutidoaquí, pero nadie ha dado una explicación o referencia convincente.

Sus argumentos están en una base ligeramente diferente, pero esencialmente igual.

typedef struct _pack{
    int64_t c;
} pack;

int main(){
    pack *p;
    char str[9] = "aaaaaaaa"; // Input
    size_t len = offsetof(pack, c) + (strlen(str) + 1);
    p = malloc(len);
    // This line, with similar intention:
    strcpy((char*)&(p->c), str);
//                ^^^^^^^

Respuestas a la pregunta(3)

Su respuesta a la pregunta