Использование неверного спецификатора формата для printf вызывает неопределенные ошибки поведения, означающие, что может произойти все что угодно.Размышление о том, почему вы получаете определенный вид неопределенного поведения, не даст вам много значимых знаний, но в любом случае ...
В случае printf("%s\n",1000);
вы просто лжете компилятору и говорите емучто 1000
является указателем на выделенную строку символов.Трудно точно сказать, что произойдет - возможно, компилятор убежит по адресу 1000 и попытается получить к нему доступ, что может привести к сбою.
В случае printf("%c\n",1000);
это на самом деле несколько детерминированное поведение,случайно.Все аргументы переменных функций, таких как printf, неявно продвигаются.Если бы вы передали char
, он был бы повышен до int
, а затем преобразован обратно в char
.
Но вы передали целочисленную константу 1000
, которая имеет тип int
.Как это происходит, printf
ожидает int
после неявного повышения и попытается преобразовать 1000
«назад» в char
.Это означает, что компилятор захватит младший значащий байт int
и обработает его как char
(или быть разборчивым, как unsigned char
).
1000
== 0x000003E8
.Преобразование char
захватит младший значащий байт E8
.А затем выведите то, что этот символ представляет в таблице символов, если что-нибудь.