#C 语言标准库函数 va_copy
/*********************************************
* @brief 复制可变参数列表
* @param dest 目标可变参数列表
* @param src 源可变参数列表
********************************************/
void va_copy(va_list dest, va_list src);
说明
将可变参数列表 src
复制到 dest
。
在函数返回之前,可变参数列表 dest
必须使用 va_end 函数进行清理,否则是未定义行为。
参数
dest
- 目标可变参数列表src
- 源可变参数列表
返回值
无
#示例
#include <stdio.h>
#include <stdarg.h>
// 计算方差
double variance(int count, ...)
{
// 创建并初始化可变参数列表
va_list args1;
va_start(args1, count);
// 拷贝可变参数列表
va_list args2;
va_copy(args2, args1);
// 求和
double sum = 0;
for (int i = 0; i < count; i+=1)
{
sum += va_arg(args1, double); // 读取下一个可变参数
}
va_end(args1); // 清理 args1
// 计算均值
double mean = sum / count;
// 计算与均值之差的平方之和
double result = 0;
for (int i = 0; i < count; i+=1)
{
double num = va_arg(args2, double); // 读取下一个可变参数
result += (num - mean) * (num - mean);
}
va_end(args2); // 清理 args2
// 返回方差
return result / count;
}
int main(void)
{
printf("%f\n", variance(9, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0));
return 0;
}
运行结果:
6.666667
#推荐阅读
#外部参考
#参考标准
- C11 standard (ISO/IEC 9899:2011):
- 7.16.1.2 The va_copy macro (p: 270)
- C99 standard (ISO/IEC 9899:1999):
- 7.15.1.2 The va_copy macro (p: 250)