Как было отмечено ранее, это зависит от реализации.
В соглашении о вызовах C (известном как cdecl
) аргументы помещаются в стек в обратном порядке, поэтому:
void myfunc(int one, int two, int three)
будет выглядеть в стеке после его вызова (стек увеличивается вверх, к 0):
. . 0x00000000
. .
. .
| current frame |
|----------------|
| return address |
|----------------| ^
| one | | stack
|----------------| | growth
| two | | direction
|----------------| |
| three |
|----------------|
| previous frame |
...
... 0xFFFFFFFF
Итак, первый аргумент может быть извлечен первым (потому что мы знаем, что это местоположение, это как раз перед адресом возврата), и, надеюсь, он содержит достаточно информации о количестве других аргументов. Например, в printf(3)
и связанных функциях вся информация о других аргументах присутствует в строке формата, которая является первым аргументом.