c - 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_*
中定义的函数的宏?
所以,我的问题是,--这些参数存储在内存的什么位置?它是编译器定义的地方吗?
解决方案
推荐阅读
- java - java - 多个微服务一个数据库
- ios - 无法将“TableViewController”类型的值转换为“NSString”
- python - 在分区 Parquet 数据集上应用函数而不进行随机播放
- proxy - 父代理在 3proxy 中不起作用
- php - 更新图片链接到他们自己的 URL
- php - 如何从任何设备打开 localhost 但不使用 ngrok?
- c# - 再次指定了无效的提供程序类型
- python - 如何缩短此二维数组代码?
- javascript - 正确使用 Express 的 res.render() 和 res.redirect()
- c++ - 如何验证集合C ++中是否存在元素< x