по-горе колегата @HCL ти го е обяснил
а и аз по-горе май бях писал че не е работа на компилатора да следи какво привиш с аргументите на функции декларирани с "..." !
за да схаванеш кашата - ето ти пример:
printf ("%u, %lu, %s %s", 12345, 12345, "Hello", "Gogo");
ако приемем че за комп. 12345 е short; а (char *) е 2 байта то:
компилатора ще натъпче в стека :2+2+2+2 байта
при интерпретацията на "%u, %lu, %s %s" - printf ще очаква 2+4+2+2 байта
и така особенно при %s става весело
за да си сигурен че ще видиш "Hello Gogo" ще трябва:
printf ("%u, %lu, %s %s", (short) 12345, (long) 12345, "Hello", "Gogo");
пак: на всеки %u, %ul, %i, ..... трябва да съответства аргумент от същия тип (най-вече размер в байтове

)!
ако един от арументите а опетлан - се отразява на всички след него и бозата е пълна
от това по-просто май не мога го обясня
