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

来源:互联网 发布:线条随鼠标特效源码 编辑:程序博客网 时间:2024/06/10 08:00

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) 只会输出第一个字节的,小端机也就是最低位!


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


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

  

0 0