首页 > 技术文章 > va_arg读取类型不匹配

mushrain 2021-05-20 12:39 原文

va_arg读取类型不匹配

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

double average(int num, ...) {
    va_list valist;
    // 定义函数额外参数序列
    double sum = 0.0;
    int i;

    // 为num个参数初始化
    va_start(valist, num);
	
    for (i = 0; i < num; i ++) {
        sum += va_arg(valist, double);
    }
    // 根据类型获取数字
    va_end(valist);

    // 释放内存
    return sum / num;
}

int main() {
    printf("Average of numbers is %340f\n", average(1, 1));
    return 0;
}
Average of numbers is 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049406564584124654

va_arg(va, type)是按照type类型的格式去读取va当前指向的数据,而且是强制性(底层数据)的。

如上,我把1(int)类型的数据强制读成double结果输出的值是下面的这个值。

可见,这里绝不是什么自动类型提升,一定注意,不同类型的数据一定使用对应的格式去读取

推荐阅读