面试题答案
一键面试-
va_start
宏:- 作用:初始化一个指向可变参数列表的指针。它需要两个参数,第一个是
va_list
类型的变量(通常是一个自定义的变量,用于保存可变参数列表的状态),第二个参数是可变参数函数原型中最后一个命名参数。通过va_start
,程序能够定位到可变参数列表的起始位置。
- 作用:初始化一个指向可变参数列表的指针。它需要两个参数,第一个是
-
va_arg
宏:- 作用:从可变参数列表中获取当前参数,并将指针指向下一个参数。它需要两个参数,第一个是
va_list
类型的变量,第二个是要获取的参数的类型。每次调用va_arg
,它会根据指定的类型从可变参数列表中取出相应大小的数据,并调整指针位置,以便下次获取下一个参数。
- 作用:从可变参数列表中获取当前参数,并将指针指向下一个参数。它需要两个参数,第一个是
-
va_end
宏:- 作用:清理
va_list
类型的变量,释放相关资源。在使用完可变参数列表后,必须调用va_end
,以确保程序的正确运行和资源的合理释放。
- 作用:清理
-
使用顺序:
- 首先调用
va_start
初始化可变参数列表指针。 - 然后通过多次调用
va_arg
按顺序获取可变参数列表中的参数。 - 最后调用
va_end
清理可变参数列表指针。
- 首先调用
-
示例代码:
#include <stdio.h>
#include <stdarg.h>
// 计算可变数量整数的和
int sum(int num,...) {
va_list args;
int total = 0;
int i;
// 初始化可变参数列表
va_start(args, num);
for (i = 0; i < num; i++) {
// 获取当前参数并累加到total
total += va_arg(args, int);
}
// 清理可变参数列表
va_end(args);
return total;
}
int main() {
int result = sum(3, 1, 2, 3);
printf("Sum is: %d\n", result);
return 0;
}
在上述代码中,sum
函数接受一个固定参数num
表示可变参数的数量,然后通过va_start
初始化可变参数列表,使用va_arg
逐个获取可变参数并累加,最后用va_end
清理可变参数列表。在main
函数中调用sum
函数并输出结果。