gpt4 book ai didi

c - C 中的可变长度参数

转载 作者:行者123 更新时间:2023-11-30 21:19:55 25 4
gpt4 key购买 nike

我了解到此代码将在终端中打印 10, 30, 60。

#include <stdio.h>

void add(int num, ...);

int main(int argc, char const *argv[])
{
int a=10, b=20, c=30;

add(1, a);
add(2, a, b);
add(3, a, b, c);

return 0;
}

void add(int num, ...)
{
int* p = NULL;
p = &num + 1;

if (num == 1)
printf("%d \n", p[0]);
else if (num == 2)
printf("%d \n", p[0] + p[1]);
else
printf("%d \n", p[0] + p[1] + p[2]);
}

但是,它只打印奇数......:(我只想在 内打印 10, 30, 60。你认为我应该修复哪里?

最佳答案

仅通过获取最后一个给定参数的地址并将其添加到其中,无法获得可变参数。函数参数如何在堆栈上布局(如果使用堆栈)取决于编译器和系统。这就是为什么你会得到奇怪的数字。

可移植地执行此操作的方法是使用 va_list,如下所示:

void add(int num, ...)
{
// the va_list used to retrieve the extra arguments
va_list args;
int i, sum = 0;

// use va_start to start processing arguments, passing in the last explicit argument
va_start(args, num);
for (i=0; i<num; i++) {
// extract the next argument with the given type
sum += va_arg(args, int);
}
// cleanup
va_end(args);

printf("%d \n", sum);
}

有关更多详细信息,请参阅stdarg man page .

关于c - C 中的可变长度参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com