C语言函数可变参数的原理
可变参数函数原型
Printk函数原型如程序清单 1.1所示:
程序清单 1.1
int printk(const char *fmt, ...);
从printk函数原型可知,printk除了接收一个固定参数fmt外,后面的参数用...表示。在C/C++语言中,...表示可以接收可变数量的参数(0或0个以上参数)。
函数参数传递方式
Printk的参数通过栈来传递,在C/C++中,函数默认调用方式是_cdecl,表示由调用者管理参数入栈操作,且入栈顺序为从右至左,入栈方向为从高地址到低地址。因此,从第n个到第1个参数被放在地址递减的栈中。
假设现在有一段代码如程序清单 1.2所示:
程序清单 1.2
int a = 0x12345678;
char b = 2;
char *c = "hello";
printk("print %d, %d, %s\n", a, b, c);
调用printk时参数在栈中的分布如图 1.1所示:
图 1.1 Printk参数在栈中的分布
这里假设"print %d, %d, %s\n"字符串的首地址是0x20000000,"hello"字符串的首地址是0x10000000。从图 1.1中还能看出一个有意思的地方,那就是参数b虽然是1个字节,但是压栈时被扩展为4字节数据,高位补0。也就是说每次压栈的数据最少为4字节,不足4字节的数据补0。
可变参数操作宏
假设有一段代码如程序清单 1.3所示:
Printk函数简单解析
最新推荐文章于 2023-03-09 08:46:30 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)