首页 > 解决方案 > 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_*中定义的函数的宏?

所以,我的问题是,--这些参数存储在内存的什么位置?它是编译器定义的地方吗?

标签: cargumentsvariadicmemory-layout

解决方案


推荐阅读