C, Malloc () e comprimento da matriz [duplicado]

Duplicata Possível:
Como encontrar o sizeof (um ponteiro apontando para uma matriz)

Estou aprendendo a criar um array dinâmico em C, mas me deparei com um problema que não consigo entender.

Se eu usar o código:

int num[10];
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

Eu obtenho a saída:

sizeof num = 40
sizeof num[0] = 4

Isso é o que eu esperaria que acontecesse. No entanto, se eu malloc o tamanho da matriz como:

int *num;
num = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

Então eu recebo a saída:

sizeof num = 8
sizeof num[0] = 4

Estou curioso para saber porque o tamanho da matriz é 40 quando eu uso o método de comprimento fixo, mas não quando eu usomalloc().