va_start和va_end使用介绍
创作时间:
作者:
@小白创作中心
va_start和va_end使用介绍
引用
CSDN
1.
https://blog.csdn.net/kupepoem/article/details/139487592
一、概述
在C语言编程中,函数的形式参数数目通常是确定的,调用时需要依次给出与形式参数对应的所有实际参数。但在某些情况下,希望函数的参数个数可以根据需要确定。例如,我们熟悉的printf()、scanf()和系统调用execl()等函数。那么它们是如何实现的呢?
C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、va_arg和va_end等。在讲解这些宏之前,我们先了解一下调用函数时传入参数的处理过程。
在C语言中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表:
void demo(...);
void demo(parm_list,...);
这种方式与我们以前认识的函数参数列表不同,但需要记住这是C语言中一种传参的形式,在后面我们就会用到它。
二、原理
函数参数是以数据结构栈的形式存取,从右至左入栈。
举个例子:
void demo(int x, float y, char z);
那么,调用函数的时候,实参 char z 先进栈,然后是 float y,最后是 int x,因此在内存中变量的存放次序是 x->y->z。因此,从理论上说,我们只要探测到任意一个变量的地址,并且知道其他变量的类型,通过指针移位运算,则总可以顺藤摸瓜找到其他的输入变量。
下面是 <stdarg.h> 里面重要的几个宏定义:
假设有一个函数:void demo(char para, ...);
typedef char* va_list;
void va_start(va_list ap, para); /* ANSI version */
type va_arg(va_list ap, type);
void va_end(va_list ap);
va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
- 在调用参数表之前,定义一个
va_list类型的变量(假设为ap); - 应该对
ap进行初始化,让它指向"可变参数表"里面的第一个参数,通过调用va_start来实现的,第一个参数是ap本身,第二个参数是在"变参表"前面紧挨着的变量即para,也就是“...”之前的那个参数;可变参数表就是“...”,简称变参表。 - 若想获取参数,调用
va_arg,它的第一个参数是ap,第二个参数是要获取参数的类型,然后返回此类型的值,这两个类型必须一致,并把ap的位置指向"变参表"的下一个变量位置; - 获取所有的参数之后,有必要将这个
ap指针关掉,以免发生危险,调用va_end方法将输入参数ap置为NULL,应该养成获取完参数表之后关闭指针的习惯。
三、示例
热门推荐
提醒:恩替卡韦不能随意吃,把握正确服用的 3 大要点
社区健康管理体检项目有哪些
电动车增程器的原理是什么?
全球TDI产能正向中国集中 万华化学生产规模跃居首位
压力开关调试方法与注意事项
如何与偏执型人格障碍的人相处
西湖大学与河南大学科研团队在高效稳定近红外InAs量子点LED研究上取得进展
阳台吊顶用什么材料?家居装修新选择
急性烧伤或烫伤后如何判断严重程度
如何有效评估和确定安全边际的范围?这种评估和确定的依据是什么?
“短途游”成热门选择,清明假期日均客流预计破4000万
孵小鸡多少天踩水合适 踩水一次多久
矿物和岩石的基本知识
虚拟机如何BIOS启动pe
社保卡使用全攻略:从封存处理到跨省转移
低聚木糖:作用于肠道菌群抑制肥胖的研究进展
新生儿一天老睡觉正常吗
MATLAB结构体:深入解析其内部机制和高效使用技巧,提升数据处理效率
2024中国乳腺医院排名前十:专业团队与特色诊疗全解析
什么是ESC? 一项防止车辆打滑并提高驾驶时稳定性的技术
梦境之语:解读梦中蜈蚣的深层寓意
小白必学!香草看涨期权的特点与收益计算
项目进度推进会如何发言
五种食物可以吃掉黑眼圈
鸡球虫病用什么药最佳
大树——生命力的象征(探秘大树的神奇之处)
鞋柜设计的要点是什么?如何实现储物与美观的平衡?
何美钿个人资料简介:从体操冠军到演艺圈
椎间盘突出怎么办?正确运动可以减缓症状与强化身体!
隔离变压器与普通变压器的区别:原理对比与应用场景