Есть много вещей, зависящих от компилятора / среды, в поведении printf.
printf якобы использует функции var args C, когда у вас есть объявление
int printf(char* formatStr, ...)
Вы можете передать несколько аргументов в "...". Затем в теле printf вы должны сделать что-то вроде следующего:
// count how many formatters are in the format string
// and calculate "amount"
// here amount = 3
va_list valsToPrint;
va_start(valsToPrint,amount);
for (int i = 0; i < amount; ++i)
{
// treat each value as a 32-bit int and print it
}
va_end(vl);
Важно то, что здесь много чего зависит от компилятора / среды. Например, тот факт, что структура, вероятно, упакована так, что каждое значение отображается на 32-битных границах, и как va_list фактически определяется из компилятора. Я предполагаю, что компилятор-компилятор может отличаться от вашего кода, но неудивительно, что он демонстрирует поведение, которое вы описываете.