... No entanto, como você só alocou um byte então na minha opinião deveria dar segmentation fault quando você tenta armazenar o número.
Isso também me confundiu. Eu também esperava encontrar um Segmentation Fault neste código, mas fui dar uma olhada no manual da LIBC:
... The block that malloc gives you is guaranteed to be aligned so that it can hold any type of data. In the GNU system, the address is always a multiple of eight on most systems, and a multiple of 16 on 64-bit systems.
Assim, suponho, por causa desse alinhamento, é possível que malloc(1) seja, na verdade, malloc( 8 ). De fato, se fizermos:
#include <malloc.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int *p = (int *)malloc(1);
p[0] = 1; p[1] = 2;
printf(%d %d\n", p[0], p[1]);
free(p);
return 0;
}
p[1] será impresso errado (pelo menos no meu teste), mas não ocorretá um SEGFAULT. Mas acrescentando um p[3], obtive um SEGFAULT no free(p).
De qualquer forma, mesmo que não tenha dado erro é melhor você usar o operador sizeof para determinar a quantidade de memória a ser alocada pelo malloc. C já te dá muitas possibilidades de "errar alguma coisa" e é melhor não procurar outras esnecessariamente.
Darcamo, como sempre, está mais que correto... Mesmo sabendo dessa característica da LIBC, não devemos explorá-la. É bem mais prudente alocar os blocos de memória com o tamanho correto.