Объявление printf
выглядит так:
int printf(const char *format, ...);
Он принимает аргументы переменной длины, где первый format
является обязательным. Но он не может знать типы более поздних аргументов заранее, то есть во время компиляции. Таким образом, чтобы определить тип для более поздних аргументов, т. Е. Узнать, сколько байтов он должен прочитать из памяти, как интерпретировать эти байты и т. Д., Он полностью зависит от спецификатора формата, присутствующего в строке формата.
И по этой причине спецификатор формата и фактический тип должны совпадать. В противном случае это будет неопределенное поведение, и в этом случае может произойти что угодно.