En effet, le langage C ne permet pas de vérifier l'étendue de la mémoire. Il alloue un octet, puis votre affectation via le pointeur l'écrase ainsi que les trois octets suivants. Si vous aviez alloué un autre bit de mémoire juste après le premier malloc, mais avant l'affectation, vous auriez pu écraser une partie du tas (en fonction de la façon dont votre malloc fonctionne).
C'est pourquoi les pointeurs peuvent être très dangereux en C.
Le %d dans l'instruction de format (plus le type de la variable) indique au compilateur qu'il s'agit d'un int et qu'il accède aux quatre octets.
Notez que si vous aviez réellement assigné la valeur à un char, par exemple char *ptr ; *ptr = 100000 ;
alors avec certains compilateurs (et en supposant que les caractères simples soient traités comme signés par défaut), il aurait été imprimé -96, et non 255 (ou 127). C'est parce que le compilateur ne limite pas automatiquement la valeur à la valeur la plus élevée possible (127 dans un caractère signé, 255 dans un caractère non signé), mais au lieu de cela, il déborde. La plupart des compilateurs se plaindront que vous essayez d'assigner une valeur constante qui dépasse la variable.
La raison pour laquelle il s'agit de -96 est que 100000 % 256 est égal à 160, mais en tant que caractère signé, il est restitué sous la forme -(256-160).