编译器为C中的变量参数列表使用了什么样的数据结构?

时间:2011-07-06 03:50:56

标签: c

在处理C中的变量参数列表时,我只是想知道在列表中存储变量参数时编译器可能使用的数据结构。

  1. 是一个void指针数组吗?
  2. 是无效指针的链接列表吗?
  3. 或其他什么?

2 个答案:

答案 0 :(得分:3)

没有结构。调用代码只是将参数放在堆栈上,这是vararg函数正确解码它们的责任。

例如,对于printf,第一个参数是固定的,一个c字符串,其余的根据字符串中的内容进行解码。 C只是为您提供了访问这些元素的工具,因此您不必根据字段的大小(依赖于体系结构)进行堆栈指针算法。

答案 1 :(得分:1)

编译器实际上没有做任何特殊的事情。在编译期间,当调用函数时,编译器将像往常一样生成代码以将整个参数列表连续地推送到堆栈上(通常以相反的顺序,取决于调用约定)。

然后被调用者有责任从堆栈中检测并引用这些参数。要做到这一点,被调用者必须知道参数的数量以及第一个参数的堆栈内存地址(这始终是堆栈帧指针的已知偏移量)。要确定参数的数量,必须传达此信息。这通常通过以下方式实现:

  1. 第一个参数是一个整数,它明确指出参数的数量 来吧。
  2. 信息在第一个参数内编码,例如printf
  3. 通常使用C宏来自动化它并封装其中的一些细节。请参阅:stdarg.h Macros