Инкремент указателя возвращает неверное значение

Столкнулся с одной странностью...

Есть функция с переменным числом аргументов:

void func(int32_t a, int32_t b, int32_t c){
    int32_t* ptr = &a;
    printf("%d\n", *(ptr++));
    printf("%d\n", *(ptr++));
    printf("%d\n", *(ptr++));
    printf("%d\n", *(ptr++));
    printf("%d\n", *(ptr++));
} 

По какой-то причине выражение ptr++ не перемещает меня с &a к &b, а выдаёт 0, будто-бы int32_t = 2 байта???

Вот ожидаемый вывод:

1
2
3
4
5

Но по какой-то причине выводиться это:

1
0
2
0
3

Я полагаю дело в компиляторе?


Ответы (2 шт):

Автор решения: TheCPPNoob

Как написали в комментариях - используйте stdarg.h, и будет вам счастье.

→ Ссылка
Автор решения: Сергей Симонов

В стандарте С не оговаривается как именно компилятор должен реализовывать размещение аргументов функции на стеке.

В вашем случае результат говорит о том, что компилятор положил аргументы функции на стек с 64-битным выравниванием. Это нормально.

→ Ссылка