2013-04-30 94 views
2

我正在写一些C代码,当遇到一个方法时,我想知道参数变量存储在内存中的位置。 我了解以下内容:参数变量存储在内存中的位置?

全局变量 - >存储在静态

静态varables的代码段 - >

局部自动变量(inside方法) - >存储在堆栈

本地上静态变量 - >存储在堆栈中

局部常量变量 - >存储在堆栈中

假设我的假设是正确的。

但是参数变量存储在哪里?例如:int *(int x,char * c);

谢谢!

编辑: 我知道,当我malloc的东西,它被放置在堆上,但是说我取消引用指针来获得在指针位置值,是也存储在堆或者是现在在堆栈中?

+0

回答您的编辑:值仍然存储在堆上。当你取消引用一个指针时,你触发一个存储器读取访问存储在你的指针中的任何地址(无论是堆栈,堆等)。根据编译器生成的机器码,读取值可能会临时放置到CPU寄存器中以进行高效的进一步处理。 – 2013-04-30 16:59:02

回答

1

C,ITYM函数中没有方法。

全局变量以及静态变量都存储在.data或.bss段(以下称为“数据段”)中。

本地静态变量也存储在数据段中。

函数的参数值也存储在堆栈中,并在返回地址之前立即推送。

生活在堆栈上的所有东西(局部变量,参数等)也可以存在于寄存器中。这就是为什么C标准没有明确规定在什么地方存储的地方。

0

函数参数(“参数”)根本不需要存储。记住:C使用价值呼叫。一个值不需要存储在内存中,它可以存放在一个寄存器中,或者它的值可以通过某种方式从程序状态中得出结论。

例如,像strlen()或sin(),cos(),sqrt()这样的库函数可以用硬件实现。通过将对应于x的某些值存储到特殊功能寄存器中,发出一个特殊功能指令并将结果提取出来,可以实现sin(x)可以实现。 (浮点硬件有时甚至有伪指令来以最好的精度表示例如Pi。Pi值永远不会通过,只有指令“使用Pi/2”)

即使对于“正常”用户定义的函数,参数也可以通过寄存器传递,多个参数可以将组合成一个大的注册,甚至可以优化出来。

这是内联函数最好的可见性,它们可以完全消失,因为它们的功能与调用者的功能相结合。

当函数获取其参数的地址时(例如int func(int arg) { int *p = &arg; }将强制arg获得地址),情况会有所不同,但这种情况相对较少。

WRT标准:一个C函数有一个激活记录。 (非标准人员可能会称之为“堆栈框架”)。该函数的行为好像参数是其局部变量的一部分,并且一旦函数返回,它们就超出范围。 他们如何得到他们的价值是完全不相干的,理论上甚至可以通过消息传递来完成。