5

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

全局变量 -> 存储在静态代码部分

静态变量->

本地自动变量(内部方法)-> 存储在堆栈中

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

本地 const 变量 -> 存储在堆栈中

假设我的假设是正确的。

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

谢谢!

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

4

3 回答 3

7

这取决于许多不同的事情,调用约定是主要要研究的事情。本页x86介绍了各种调用约定以及如何将参数传递给函数,并且此参考介绍了各种 C++ 编译器和平台使用的调用约定。通常,它要么位于通过寄存器的堆栈上。

我对C++(嵌套)函数调用指令的回答——寄存器也是相关的,并且有一些更有用的链接。

于 2013-04-30T16:30:04.973 回答
4

函数参数(“参数”)根本不需要存储。请记住:C 使用按值调用。一个值不需要存储在内存位置,它可以存在于寄存器中,或者它的值可以以某种方式从程序状态中得出。

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

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

内联函数最容易看到这一点,它们可以完全消失,因为它们的功能已经与调用者的功能结合在一起。

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

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

于 2013-04-30T17:11:37.260 回答
2

C、ITYM 函数中没有方法。

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

局部静态变量也存储在数据段中。

函数的参数值也存储在堆栈中,紧接在返回地址之前。

堆栈中的所有内容(局部变量、参数等)也可以存在于寄存器中。这就是为什么 C 标准没有明确说明在哪里存储什么。

于 2013-04-30T16:30:33.930 回答