¿Por qué funciona malloc (sizeof (pointer))?

Este código siguiente funciona bien:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    struct node{
        int a, b, c, d, e;
    };
    struct node *ptr = NULL;
    printf("Size of pointer ptr is %lu bytes\n",sizeof (ptr));
    printf("Size of struct node is %lu bytes\n",sizeof (struct node));
    ptr = (struct node*)malloc(sizeof (ptr));               //Line 1
//    ptr = (struct node*)malloc(sizeof (struct node));    //Line 2

    ptr->a = 1; ptr->b = 2; ptr->c = 3; ptr->d = 4; ptr->e = 5;
    printf("a: %d, b: %d, c: %d, d: %d, e: %d\n",
            ptr->a,ptr->b,ptr->c,ptr->d,ptr->e);
    return 0;
}

Cuando se cumpla como:

gcc -Wall file.c

Mi pregunta es: ¿por qué esto está bien?

malloc&nbsp;asigna el número de bytes que se especifican en su argumento. aquísizeof ptr&nbsp;es de 8 bytes en mi máquina de Linux de 64 bits. pensémalloc&nbsp;proporcionará 8 bytes, pero entonces, ¿cómo está accediendo a todas las variables a, b, c, d, e? ¿Es solo con gcc o me falta algo con el estándar C?

Por lo que sé, la "Línea 2" debería estar allí en lugar de la "Línea 1", pero cualquiera de las líneas funciona bien. ¿Por qué?