首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

printf函数栈的有关问题

2013-07-08 
printf函数栈的问题我们知道,C语言是调用者负责管理堆栈,所以实现有可变参数的函数。对于可变参数的函数,其

printf函数栈的问题
我们知道,C语言是调用者负责管理堆栈,所以实现有可变参数的函数。对于可变参数的函数,其压栈与清栈在编译时写在调用处,而其参数的使用则是被调用函数在运行时控制。那么,对于这个例子:


printf函数栈的有关问题
[解决办法]
根据我的理解,printf("%f %f\n",a,b);语句中,printf会根据两个%f来寻找跟在后面的两个参数,而不会识别不同的两个参数,如:printf寻找a的时候,只识别它的4个字节,而不会当成8个字节来读。
以下是建栈的过程:
建栈:
push b,
push a,
push pt,//"%f %f\n"字符串的函数指针
call @printf


[解决办法]
任何变量都要内存对齐,另外因为不定参数的原因,float变量也会扩宽带double.
[解决办法]
int char short 16位系统 转成int,2字节压栈,32位系统 转成int,4字节压栈
float,double 转成double具体就是,用浮点寄存器堆栈获取,然后8字节,浮点寄存器栈顶数据压栈
指针16位系统 near 指针转成int(2字节其实根本就不做任何转换,4字节直接入栈) 
或者 far指针转long (其实根本就不做任何转换,4字节直接入栈,指针本来就是这样表示的)
32 位16位系统转long (或int)(其实根本就不做任何转换,4字节直接入栈,指针本来就是这样表示的)

[解决办法]
引用:
这种用法有问题, c变参调用, 被调用者是无法判断参数格式的, 要通过字符串制定. 因此%f告诉被调用者参数为4字节float, 但其实传入的是double(8字节), 这将导致被动函数判断错误.
printf里面的 %f 都是读取sizeof(double)的

热点排行