Вы передаете неправильный тип на putchar
в последней строке.
Тип (ptr+1)
равен char (*)[4]
.
Тип *(ptr+1)
равен char [4]
, который уменьшается до char*
.
Тип *(ptr+1)+2
является char*
.
Указатель преобразуется в какой-то странный int
, который объясняет вывод - или мусор, как вы выразились более четко.
В случае сомнений лучше упростить ваш код, чем задаться вопросом, что происходит.
Использование
char c = *(ptr+1)+2;
putchar(c);
мог бы выявить проблему раньше.