永发信息网

C语言变参函数Printf实现机制是什么?

答案:4  悬赏:60  手机版
解决时间 2021-02-28 22:05
c语言中Printf输出参数的个数是不定的,这是怎么实现的?我没有财富值了,等有了我一定追加
最佳答案
在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。printf的第一个被找到的参数就是那个字符指针,就是被双引号括起来的那一部分,函数通过判断字符串里控制参数的个数来判断参数个数及数据类型,通过这些就可算出数据需要的堆栈指针的偏移量了,下面给出printf("%d,%d",a,b);(其中a、b都是int型的)的汇编代码.

.section
.data
string out = "%d,%d"
push b //最后的先压入栈中
push a //最先的后压入栈中
push $out//参数控制的那个字符串常量是最后被压入的
call printf

你会看到,参数是最后的先压入栈中,最先的后压入栈中,参数控制的那个字符串常量是最后被压入的,所以这个常量总是能被找到的。

通常情况下函数可变参数表的长度是已知的,通过num参数传入,这种函数比较容易实现。
全部回答
va_list 百度下就可以 了
函数调用方式有很多种比如 _stdcall _cdecl前者 参数从右往左入栈,调用者清栈,后者也是参数从右往左入栈,但是是函数自己清栈,所以前者可以支持变参数,因为只有调用者知道参数的个数,而被调用者就是函数自己并不知道。printf就是_stdcall类型的调用方式。 c/c++ 函数默认的调用方式是_cdecl.
像printf()/scanf()这样参数数量可变的函数称为variadic函数,请自行在网上查找相关资料吧.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
想加客户为微信好友,怎么介绍自己
丝芙兰京基百纳店这个地址在什么地方,我要处
我在2个省份缴纳过社保,最后一个省份打印所
学校工作存在的主要问题是什么
小象Q比南充店怎么去啊,有知道地址的么
东兴到厦门的直达多少钱
下面图1是印度尼西亚爪哇岛沿海某地区等高线
四大名著中哪一个谜语是旅美备忘录
人多说话紧张怎么办
男友把一个女孩子的照片放在手机电池的背面,
为什么会有些人会埋怨
扬子宾馆怎么去啊,有知道地址的么
护肤的基本步骤是怎样的。?
百度云限速怎么破
有什么学校不用高考就能上的大专
推荐资讯
西安兴昱珠宝展柜在什么地方啊,我要过去处理
刘芳商贸有限公司我想知道这个在什么地方
百度送红包的网站 怎么支付不了.
七芯及以上的芯线截面小于( )的较长控制电缆
梦到头发变白
日本三井企业是做什么的?
QQ音乐整的补齐年费是不是说你只要交六个月的
实况足球PES6谁最强?最强阵容是什么?
华为手机淘宝怎么追加评
李明同学感到很饥饿,若想在最短时间内改变这
永胜机电物资公司这个地址在什么地方,我要处
QQ群管理员可以删除群聊天消息记录吗?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?