可变参数函数

本文介绍了C语言中可变参数函数的使用,包括`stdarg.h`中的宏`va_list`、`va_start`、`va_arg`和`va_end`。详细解释了可变参数的压栈原理,并通过示例展示了如何获取和使用这些参数。同时提醒在使用可变参数时需要注意参数长度的获取和潜在的错误情况。
摘要由CSDN通过智能技术生成

可变参数相关的宏

首先先了解几个宏:

typedef __gnuc_va_list va_list;
#define va_start(v,l)	__builtin_va_start(v,l)
#define va_end(v)	__builtin_va_end(v)
#define va_arg(v,l)	__builtin_va_arg(v,l)

这几个宏可以在stdarg.h中找到。va是variable-argument的缩写,方便记忆。
va_list继续追踪为:

typedef __builtin_va_list __gnuc_va_list;

这是由编译器内置的变量,可以和int、char等一样去理解。
va_start(v,l)用于初始化va_list变量(对应参数v),参数l为可变参数前一个参数;
va_arg(v,l)用于获取可变的参数,l对应获取的类型,如int等;
va_end(v)用于结束参数获取。

可变参数获取原理

在函数的调用时,参数压栈是从右到左进行的,即最后一个参数先入栈,第一个参数最后入栈。栈的生长方向一般都是向下生长的,即先入栈的地址高,后入栈的地址低。

地址低			|———————————————|
				|    全局量      |
		 堆起始->|———————————————|
				|  堆向高地址增长 |
				|               |
				|               |
				|    自由空间    |
				|               |
				|               |
				|  栈向低地址增长 |
地址高 	 栈起始->|———————————————|

当我们知道第一个参数(即最后一个入栈的参数)的地址,同时知道各个参数的类型时,即可通过地址的移动获取到对一个的变量值。

地址低						|---------------......----<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值