C语言中变长参数表printf的实现和参数入栈次序之间的关系
来源:互联网 发布:mac 连不上wifi 编辑:程序博客网 时间:2024/05/16 06:14
“C语言的从右到左入栈的特性使其可以实现如printf之类的变长参数函数”
这是个命题,而且是个真命题。晚上查阅了一些资料,先总结如下:
(1)变长参数列表和固定参数的区别:
我们写的大部分函数都是固定参数函数(至少我没有写过变长参数函数),编译之后,形参的地址是固定的,而且被调用函数也知道形参的地址,所以可以正确取值。比如int func(int a,int b)
(2)printf() 变长参数如何取值的?
printf函数原型中,第一个参数是不变的,一定是一个格式字符串,后面参数的个数和内容取决于第一个参数的内容,所以又称为变长参数。在printf的实现中,不难看出,被调用函数只有在取到第一个参数后,才能确定后面参数类型和个数,所以编译器务必要把第一参数房子一个固定的位置。这个位置就是%ebp+8
当调用func函数后,%ebp,%esp寄存器所指向的内存单元如图所示,那么%ebp+8 指向的就是第一个形参&arg1.(在printf函数中就是格式字符串),如果按照从左往右压栈,第一个参数就不是在栈顶,而是在栈底,也就无法知道它的具体的位置了。
总之:C语言中规定函数压栈的顺序为从右到左,使得第一参数总是在调用函数的栈顶,被调用函数总可以正确取到它,从而继续取其他的参数。
- C语言中变长参数表printf的实现和参数入栈次序之间的关系
- 【C】变长参数表及printf函数简化版的实现
- C语言中变长参数的函数的实现
- java和c语言变长参数的底层实现区别
- 变长参数printf的简单实现
- C语言中printf函数自增自减、入栈和输出关系。
- 命令行参数和变长参数表
- 关于变长参数表的
- C语言---变长参数列表---变长参数的使用
- C语言---变长参数列表---变长参数的传递
- C语言中不用宏实现变长参数函数的原理及实现
- C语言中不用宏实现变长参数函数的原理及实现
- C语言中不用宏实现变长参数函数的原理及实现
- 转载:c语言变长参数函数的实现
- C语言变长参数的认识以及宏实现
- C语言变长参数实现
- C语言变长参数实现
- C语言的变长参数 va_arg
- C/C++ 开源即时通讯系统
- 飞鸽传书岗位信息
- PostgreSQL SQL的性能调试方法1--借助统计信息
- Exitjs tree动态连接数据库加载Node
- spring 是什么
- C语言中变长参数表printf的实现和参数入栈次序之间的关系
- .NET Blog
- 操作系统
- 程序员就是一般人
- 注册表中保存的VC安装路径
- 一个进程在内存中的布局
- linux-socket通信示例(传送文件)
- BlackBerry Development with Ant & Eclipse
- JDK配置方法