C、C++语言中参数的压栈顺序
要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,…)
没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参数个数呢?这就要靠format了,编译器通过format中的%占位符的个数来确定参数的个数。
现在我们假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,之后是各个参数进栈,最后pc进栈,此时,由于format先进栈了,上面压着未知个数的参数,想要知道参数的个数,必须找到format,而要找到format,必须要知道参数的个数,这样就陷入了一个无法求解的死循环了!!
而如果把参数从右到左压栈,情况又是怎么样的?函数调用时,先把若干个参数都压入栈中,再压format,最后压pc,这样一来,栈顶指针加2便找到了format,通过format中的%占位符,取得后面参数的个数,从而正确取得所有参数。
所以,如果不存在…这种不定参的函数,则参数的压栈顺序无论是从左到右还是从右到左都是没关系的。
转载于:https://www.cnblogs.com/mini-coconut/p/9267469.html
C、C++语言中参数的压栈顺序相关推荐
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- C/C++语言函数中参数的入栈顺序
对于函数,之前认为会用就行了,对其中的原理并不是很了解,就比如函数中参数的入栈顺序(在这说明一下,函数的参数是保存在栈中的,还有一些局部变量也是存放在栈中),这个问题来源于某互联网的面试题,当然答得很 ...
- C语言初探 之 printf压栈顺序(printf(%d %d %d %d %d %d\n,a++, ++a, a++, ++a, a++, ++a ))
写在篇头: 在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 . -------------------------------------------------------- ...
- C语言初探 之 printf压栈顺序
写在篇头: 在不同的编译器下结果不同,本例测试的环境为 devcpp5.3.0.1 . -------------------------------------------------------- ...
- C语言函数参数压栈顺序为何是从右到左?
#转载自:http://blog.csdn.net/jiange_zh 上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是 ...
- 函数压栈的简解(计算顺序与压栈顺序)
重点: 函数有两个概念(压栈顺序和计算顺序) 压栈顺序知识点 1.栈是先进后出的结构 2.ebp:基地址寄存器 (栈底) esp:栈指针 (栈顶) 3.栈底到栈顶的内存地址是由高到低.就是10-> ...
- python操作符顺序_Python语言中的操作符与运算顺序
在新鲜出炉的9月TIOBE编程语言排行榜上,Python历史性的挤下C++,次进入前三位,Python的热度也以肉眼可见的速度快速上涨着,学习Python的人越来越多,不只是成人,很多青少儿也选择从P ...
- (十一)C语言中内存堆和栈的区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...
- Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...
最新文章
- 投资的境界:及时抓住机会或止损才是硬道理
- c# 设计原则需要学习吗_向最好的学习:产品设计原则
- 火狐浏览器摄像头权限怎么开启 火狐浏览器摄像头权限开启的方法
- JavaScript学习(四十三)—构造方法创建对象的图解和注意事项
- Autolayout的简单介绍和示例代码
- threadlocal使用场景_ThreadLocal有没有内存泄漏?源码给你安排得明明白白
- 差分硬盘的merge(合并差异)实验分析
- 信息熵 条件熵 信息增益 信息增益比 GINI系数
- SQL 分页查询 返回总条数
- Mac下Chrome添加.crx浏览器插件
- 【货位优化】基于遗传算法实现仓库货位优化问题含Matlab源码
- 代理的原理及类型总结
- pyenv管理虚拟环境
- 元宵节动画贺卡制作_2017鸡年元宵节flash电子贺卡模板下载-2017元宵节电子贺卡flash动画模板完整打包下载-东坡下载...
- 读史使人明智,读诗使人灵秀,数学使人周密,科学使人深刻,伦理学使人庄重,逻辑修辞之学使人善辩:凡有所学,皆成性格。
- 【 MATLAB 】gca 介绍(当前轴或图表)
- vue项目设置ip访问
- BG2RHE - 树莓派3B+外置wifi解决金属外壳屏蔽问题
- 分布式任务调度系统设计:详解Go实现任务编排与工作流
- java重写的目的是什么_什么是重写?重写的作用?
热门文章
- android通知背景色,android – 更改通知RemoteViews背景颜色
- 如何利用python实现qq聊天_用Python写一个模拟qq聊天小程序的代码实例
- c++卸载工具_IIS修复IIS出现错误后如何完全卸载重装
- spring 事务的实现方式和原理_spring整合atomikos实现分布式事务
- Idea svn 新文件自动添加到版本控制
- spring中@Value注解使用
- Android开发笔记(一百五十六)通过渲染纹理展示地球仪
- cjson 使用时遇到的问题找不到库
- JavaScript设计模式-工厂方法模式
- SQLPrompt 安装后sql上看不到菜单