va_start和va_end获取不定参数的简介

2019-12-04 14:07:00
赵勤松
原创
1830
摘要:针对C语言中的参数,我们可以用va_start和va_end宏,来进行参数的读取,以下进行详细描述。

在C中,当我们使用函数时,都会使用诸如以下形式的定义,void func_a(int a, float b, char *c)或void func_b(...), void_func_c(int a, ...),前者是固定参数,很容易就能取到所有的参数信息,而后者则是不定参数,这时候就需要我们使用va_start和va_end进行参数读取了(当然固定参数也可以使用这种方式读取,只不过没有必要罢了)。

函数参数的传递,本质上就是堆栈的存取,参数将从右至左依次压入堆栈之中,如void func(int a, float b, char *c),char *c先压入栈,然后是float b,最后是int a,因此在内存中变量的存放顺序为a->b->c(堆栈是从后向前压入的)。

知道了以上知识,我们可以明白,只要能找到其中一个参数变量的地址,以前所有变量的类型,我们就可以顺藤摸瓜,找到所有的变量内容,而我们之前说的宏va_start,其作用就是找到参数的起始位置,而宏va_end的作用,是将我们用来访问参数堆栈区域的指针释放掉,免得此变量被意外使用,更安全。

文章分类
联系我们
联系人: powereye
Email: zqs@someapp.cn
QQ: 1134846
微信: powereye