如何确定特定情况下可变参数函数的参数个数

本文探讨了如何处理C语言中的可变参数函数,并提供了一种判断参数序列结束的方法。通过对va_arg宏的理解和巧妙利用,实现了遍历并打印所有传递给函数的整数参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.心血来潮,想了解一下可变参数函数

这是vadefs.h函数中相关的定义

    #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))
    #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
    #define __crt_va_end(ap)        ((void)(ap = (va_list)0))

原来va_arg都是一些宏定义

2. 我定义一个变参函数:Var(int a,...)

    va_list arg_ptr; int j;

    j=va_arg(arg_ptr,int);

    我就想,我输入一串整数怎么才能知道它到结尾了呢?

    同时我并不想以某个特征字符来代表输入的结束,或者在函数参数时中传入要输入的个数;

3. 通过所掌握的一点点调试知识,通过查看内存,我发现当调用 va_arg() 取出最后一个参数后,arg_ptr会指向下一个内存空间【这也就是那个宏定义所表示的吧】,

    此时这个空间内容是未知的,但是现在再来调用一次  j=va_arg(arg_ptr,int) 这个值就会赋给 j ,同时art_ptr指向下一个,也不会报错【即使现在已经“非法”了,已超出范围】;

    关键的关键这时arg_ptr 指向的内存内容和那个 j 的值是一致的;也就说此时的 arg_ptr 是 和 它 前 4个字节 的 内 容 是一致的!就利用这一点

4. 于是有,本机测试:

     int *lp=arg_ptr;
    while (j != (int)(*lp)) {
        printf("j=%d\n",j);
        j = va_arg(arg_ptr, int);
        lp = arg_ptr;
    }

测试通过! 输出所有调用时的参数!

  关键看下面的图!当时难就难在取出那内存中4个字节的int整数,因为直接 printf("va_arg=%d\n",*arg_ptr) 只会输出第一个字节的,小端机也就是最低位!


  有点投机!挺有意思~不知有没有用   不知道有没有别的负面影响。


哎呀呀呀! 有个致命错误!  当传入的数据有连续重复时,就不会再读入了了啊啊啊!!

  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值