Когда вы разыменовываете указатель p
(как *p
), вы разыменовываете нулевой указатель (вы пытаетесь получить значение, на которое указывает p
, но оно фактически никуда не указывает). Это приводит к неопределенному поведению и очень часто к sh.
Когда вы используете обычный p
, вы печатаете содержимое самой переменной указателя, а не значение того, куда она указывает , Но это также приводит к неопределенному поведению, потому что формат %d
предназначен для печати значения int
, а не значения int *
. Несоответствующий спецификатор формата и тип аргумента UB.