C, Malloc () y longitud de matriz [duplicado]

Posible duplicado:
Cómo encontrar el sizeof (un puntero que apunta a una matriz)

Estoy aprendiendo a crear una matriz dinámica en C, pero he encontrado un problema que no puedo resolver.

Si utilizo el 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]));

Me sale la salida:

sizeof num = 40
sizeof num[0] = 4

Esto es lo que esperaría que sucediera. Sin embargo si malloc el tamaño de la 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]));

Entonces me sale la salida:

sizeof num = 8
sizeof num[0] = 4

Tengo curiosidad por saber por qué el tamaño de la matriz es 40 cuando uso el método de longitud fija, pero no cuando usomalloc().