转自:《C和指针》中文版,p396
我们现在可以推断出为什么参数要按照列表反序压入到堆栈中。被调用函数使用帧指针加一个偏移量来访问参数。当参数以反序压入到堆栈时,参数列表的第一个参数便位于堆栈中这堆参数的顶部,它距离帧指针的偏移量是一个常数。事实上,任何一个参数距离帧指针的偏移量都是一个常熟,这和堆栈中压入多少个参数并无关系。
如果参数以相反的顺序压入到堆栈会怎样呢(即按照参数列表顺序)?这样一来,第一个参数距离帧指针的偏移量就和压入到堆栈中的参数数量有关。编译器可以计算出这个值,但还是存在一个问题 -- 实际传递的参数数量和函数期望接受的参数数量可能并不相同。在这种情况下,这个偏移量是不正确的
那么祝反序方案中,额外当参数时如何处理当呢?堆栈帧当图显示任何额外当参数都将位于前几个参数当下马,第一个参数距离帧指针的距离将保持不变。因此,函数可以正确地访问前三个参数,对于额外的参数可以简单地忽略。
附:
为什么C中实际传递的参数数量和函数期望接受的参数数量可以不相同:
因为C的方法签名中并不包含参数,即int foo(int a)和int foo(int a, int b)不能同时出现,这点和C++不一样的。
分享到:
相关推荐
用C语言编写的一个实现将数字按反序显示的代码。
C语言程序设计-将主函数中输入的字符串反序存放;例如:输入字符串“abcdefg”,则应输出“gfedcba”;.c
输入一个字符串参数,返回该字符串的反序字符串
指针 ~~编写一个函数,将数组中n个数按反序存放。 实验步骤与要求: 在主函数中输入10个数,并输出排好序的数。 编写函数invert()将10个数按反序存放。
编写c语言小程序,使传入一个字符串按反序存放,在主函数中输入和输出字符串。
严蔚敏数据结构第二版中的链的建立,两个例程分别为建立顺序栈与反序栈,需要的可以拿去学习。适合初学者,希望对大家有所帮助!
编程序,从键盘输入正整数n,求出n与其反序数之和并输出。例如,输入2038,输出应为 2038+8302=10340。
Java反序列化终极测试工具
将十六进制代码反序输出
Java反序列化漏洞检查工具V1.2_Weblogic XML反序列化漏洞检查工具CVE-2017-10271
链表反序/逆序,递归和非递归写法
Java反序列化漏洞利用工具
java反序列化漏洞利用工具包含jboss|weblogic,网上其实有很多,但是用别人的工具收30分是不是有点不厚道,所以我用自己的分下载下来,然后以最低分贡献给大家,上次没有审核通过,希望这次可以
从求一个固定三位数字反序数,到求任意数字的反序数,然后再求任意数字的反序数
数组反序输出.c
c#序例化和反序例化的例子,可以好好參照參照。
Java反序列化终极测试工具(里面有两款)
java反序列化终极工具,含有JBoss,websphere,weblogic等反序列化漏洞利用。
java反序列漏洞验证工具