C: 使用 stdarg.h 的可变参数列表

标签 c variadic-functions

我正在试验可变参数列表并看到一些奇怪的结果...

我正在测试的代码是:

#include <stdio.h>
#include <stdarg.h>

void foo(int param1, int param2, ...)
{
    int param3 = 0;

    va_list ap;
    va_start(ap, param2);
    param3 = va_arg(ap, int);
    va_end(ap);

    printf("param3: %d\n", param3);
}


int main(void)
{
  foo(1,1);
  foo(1,1,42);

}

该片段的输出是:

param3: -1073748472
param3: 42

对于第二次调用:“foo(1,1,42)”,一切似乎都按预期工作。

对于第一次调用:'foo(1,1)',结果看起来像一个未初始化的 int,尽管我在函数开头第一次初始化它时确实将它设置为 0。

我希望能够依赖这样一个事实,即如果未调用参数,结果变量的值应为 0。我原以为 va_arg() 会足够明智地处理这个问题,但事实并非如此。

有什么建议可以解决这个问题吗?

非常感谢。

最佳答案

首先,我不明白您将 param3 初始化为零这一事实应该有什么关系,因为无论如何您稍后都会覆盖该值。

其次,尝试“提取”一个不存在的可变参数会产生未定义的行为。因此,处理该问题的唯一方法是尝试提取不存在的参数。没有办法检测参数是否存在。调用者有责任通知函数它可以安全地提取多少可变参数。

关于C: 使用 stdarg.h 的可变参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978519/

相关文章:

c - 为什么我得到结果=0.00000

c - 如何编写在C中传递给Variadic函数的变量

c++ - gcc 的显式实例化失败 - 为什么?

go - 为什么我的 for 循环不能正确循环元素?

c - strncat 上的段错误

c - 下面的 while 循环有什么问题?

android - 如何获取可执行文件的属性 C

在stm32微 Controller 上创建虚拟UART

java - 为什么将 (Object)null 结果强制转换为 not null?

c++ - C 重载与否?