Макет памяти аргументов функции в C (variadi c, ...) - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь понять, как variadi c работает в C. Я не нашел ответа в Google, поэтому здесь я.

Когда мы передаем аргумент функции, она создает копию переменной и сохраняет ее в стеке. Чтобы проверить это утверждение, я написал этот фрагмент кода:

void func(uint32_t a, uint32_t b, uint32_t c) {
  printf("%d == %d\n", a, *(&a - 0));
  printf("%d == %d\n", b, *(&a - 1));
  printf("%d == %d\n", c, *(&a - 2));
}

// somewhere in the code
func(1, 2, 3);

Вывод:

1 == 1
2 == 2
3 == 3

Итак, работает, аргументы хранятся в обратном порядке. Давайте перепишем эту функцию с помощью многоточия.

void func(uint32_t a, ...) {
  printf("%d\n", *(&a - 0));
  printf("%d\n", *(&a - 1));
  printf("%d\n", *(&a - 2));
}

Вывод:

1
0
0

Как видите, поведение отличается. Хорошо, тогда я должен заглянуть внутрь <stdarg.h> ( здесь , например)? Давайте сделаем это!

#define va_start(v,l)   __builtin_va_start(v,l)
#define va_end(v)   __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)

О, круто, это просто макрос, который вызывает __builtin_va_* функции, определенные в ... в компиляторе ?

Итак , мои вопросы: - Где в памяти хранятся эти аргументы? Это определенное компилятором место или нет?

...