如何确定特定情况下可变参数函数的参数个数
来源:互联网 发布:线条随鼠标特效源码 编辑:程序博客网 时间: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) 只会输出第一个字节的,小端机也就是最低位!
有点投机!挺有意思~不知有没有用 不知道有没有别的负面影响。
哎呀呀呀! 有个致命错误! 当传入的数据有连续重复时,就不会再读入了了啊啊啊!!
- 如何确定特定情况下可变参数函数的参数个数
- 如何实现参数个数可变的函数
- 如何实现参数个数可变的函数
- 参数个数可变的函数
- 参数个数可变的函数
- 可变参数个数的函数
- 参数个数可变的函数
- 参数个数可变函数
- 详解如何实现定义一个参数个数可变的函数
- javascript中参数个数可变的函数
- JavaScript参数个数可变的函数
- JSP(参数个数可变的函数)
- Java中也有可变参数个数的函数
- C中参数个数可变的函数
- 2. python 参数个数可变的函数
- 8.5.5 可变个数参数的函数
- C-可变参数个数函数的构建
- 参数个数可变函数浅析
- Lucene Field域的详解(二)
- java正则表达式详解
- concat方法
- BDD1.4更换Logo图片
- JavaScript—定义 getters 与 setters
- 如何确定特定情况下可变参数函数的参数个数
- 175. Combine Two Tables
- SQL 笔记(二)
- 信号量、互斥体和自旋锁
- 历年阿里面试题汇总(2017年不断更新中)
- 完成一个简单的时间片轮转多道程序
- Java设计模式
- scala之数据结构
- 【P-oj】-Fibonacci(矩阵)