我正在用C编写一些代码,当遇到一个方法时,我想知道参数变量存储在内存中的哪个位置。 我知道以下内容:
全局变量 - >存储在静态代码部分
静态可变 - >
本地自动变量(内部方法) - >存储在堆栈中
局部静态变量 - >存储在堆栈中
本地const变量 - >存储在堆栈中
假设我的假设是正确的。
但是参数变量存储在哪里? ex:int *(int x,char * c);
谢谢!
修改 我知道当我使用malloc时,它被放在堆上,但是我说取消引用指针以获取指针位置的值,是否也存储在堆中或者它现在是否在堆栈中?
答案 0 :(得分:4)
这取决于许多不同的事情,calling convention是最重要的事情。这个x86
页面涉及各种调用约定以及如何将参数传递给函数,this reference遍及各种C ++编译器和平台使用的调用约定。一般来说,它要么通过寄存器堆栈。
我对C++ (nested) function call instructions - registers的回答也是相关的,并且有一些更有用的链接。
答案 1 :(得分:2)
根本不需要存储函数参数(“参数”)。请记住:C使用按值调用。值不需要存储在存储器位置,它可以存在于寄存器中,或者它的值可以以某种方式从程序状态结束。
例如,像strlen()或sin(),cos(),sqrt()这样的库函数可以在硬件中实现。通过将对应于x
的一些值存储到特殊功能寄存器中,发出特殊功能指令并拉出结果,可以实现sin(x) 。 (浮点硬件有时甚至有伪指令以最佳精度表示Pi .Pi值永远不会传递,只有指令:“使用Pi / 2”)
即使对于“普通”用户定义函数,参数也可以通过寄存器传递,多个参数可以组合成一个大寄存器,甚至可以优化。
这在内联函数中最明显,这些函数可以完全消失,因为它们的功能已经与调用者的功能相结合。
当函数获取其中一个参数的地址时(例如int func(int arg) { int *p = &arg; }
将强制arg具有地址),情况会有所不同,但这种情况相对较少。
WRT标准:C函数具有激活记录。 (非标准人可能称之为“堆栈框架”)。函数表现为,好像参数是其局部变量的一部分,并且一旦函数返回它们就会超出范围。 如何他们获得他们的价值是完全无关紧要的,理论上它甚至可以通过消息传递来完成。
答案 2 :(得分:1)
C,ITYM功能中没有方法。
全局变量以及静态变量存储在.data或.bss部分中(以下称为“数据段”)。
本地静态变量也存储在数据段中。
函数的参数值也存储在堆栈中,在返回地址之前立即按下。
堆栈上的所有内容(局部变量,参数等)也可以存在于寄存器中。这就是为什么C标准没有明确说明存储在哪里的原因。