va_start和va_end的使用
来源:互联网 发布:淘宝好评大全50字 编辑:程序博客网 时间:2024/05/18 03:34
va_start和va_end都是c语言中的数学函数。
读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程。
void arg_test(int i, ...);int main(int argc,char *argv[]){int int_size = _INTSIZEOF(int);printf("int_size=%d\n", int_size);arg_test(0, 4);//arg_cnt(4,1,2,3,4);return 0;}void arg_test(int i, ...){int j=0;va_list arg_ptr;va_start(arg_ptr, i);printf("&i = %p\n", &i);//打印参数i在堆栈中的地址printf("arg_ptr = %p\n", arg_ptr);//打印va_start之后arg_ptr地址/*这时arg_ptr应该比参数i的地址高sizeof(int)个字节,即指向下一个参数的地址*/j=*((int *)arg_ptr);printf("%d %d\n", i, j);j=va_arg(arg_ptr, int);printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址/*这时arg_ptr应该比参数i的地址高sizeof(int)个字节,即指向下一个参数的地址,如果已经是最后一个参数,arg_ptr会为NULL*/va_end(arg_ptr);printf("%d %d\n", i, j);}
说明:
int int_size = _INTSIZEOF(int);得到int类型所占字节数
va_start(arg_ptr, i); 得到第一个可变参数地址
根据定义(va_list)&v得到起始参数的地址, 再加上_INTSIZEOF(v) ,就是其实参数下一个参数的地址,即第一个可变参数地址.
j=va_arg(arg_ptr, int); 得到第一个可变参数的值,并且arg_ptr指针上移一个_INTSIZEOF(int),即指向下一个可变参数的地址.
va_end(arg_ptr);置空arg_ptr,即arg_ptr=(void *)0;
总结:读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程.
0 0
- va_start和va_end的使用
- va_start和va_end的使用
- va_start和va_end的使用
- va_start和va_end的使用
- va_start va_arg va_end 的使用和原理
- va_start va_end 的使用和原理
- va_start &va_end 的使用和原理
- va_start &va_end 的使用和原理
- va_start va_end 的使用和原理
- va_start va_end 的使用和原理(转帖)
- va_start va_end 的使用和原理
- va_start va_end 的使用和原理
- va_start va_arg va_end 的使用和原理
- va_start va_end 的使用和原理
- va_start va_arg va_end 的使用和原理
- va_start va_end 的使用和原理
- va_start va_arg va_end 的使用和原理
- va_start和va_end的使用及原理
- poj3041Asteroids 简单二分匹配
- cocos2d-x:初探TestLua
- My Brute
- vxworks信号量分析
- 全面掌握ISO8583报文协议
- va_start和va_end的使用
- Asp.net 5种页面转向方法
- 【Linux学习】CuteFTP访问VM下ubuntu
- 博客栏目配置介绍-(个人介绍, QQ交谈, 发送邮件, 新浪微博, 天气预报...添加)
- 在 Go 语言中,正确的使用并发
- 利用ASP.NET AJAX实现表格更新程序
- 《图像纹理特征提取方法综述》论文笔记
- 网络传输文本,urlEncode和decode的iOS实现。
- 面试ASP.NET程序员的笔试题和机试题