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) 只会输出第一个字节的,小端机也就是最低位!
有点投机!挺有意思~不知有没有用 不知道有没有别的负面影响。
哎呀呀呀! 有个致命错误! 当传入的数据有连续重复时,就不会再读入了了啊啊啊!!