Потому что в C нет проверки диапазона памяти.Он выделяет байт, а затем ваше назначение через указатель перезаписывает его и следующие три байта.Если вы выделили другой бит памяти сразу после первого malloc, но перед назначением, вы могли бы перезаписать часть кучи (в зависимости от того, как работает ваш malloc).
Именно поэтому указатели могут быть очень опаснымив C.
% d в выражении формата (плюс тип переменной) сообщает компилятору, что вы смотрите на int, и получает доступ ко всем четырем байтам.
Обратите внимание, что если выдействительно присвоил значение char, например, char * ptr;* ptr = 100000;
, а затем с некоторыми компиляторами (и при условии, что обычный символ рассматривается как подписанный, но по умолчанию) он вывел бы -96, а не 255 (или 127).Это связано с тем, что компилятор не ограничивает автоматически максимальное значение, которое может поместиться (127 для знака со знаком, 255 для знака без знака), а просто переполняется.Большинство компиляторов будут жаловаться на то, что вы пытаетесь присвоить постоянное значение, которое переполняет переменную.
Причина, по которой он равен -96, состоит в том, что 100000% 256 равно 160, но как символ со знаком он выводится как256-160).