函数参数的内存位置

时间:2012-01-11 19:02:01

标签: c memory argument-passing

我正在准备我的UNIX考试,并且有一个关于C变量的内存位置的问题。 我们假设我们有这样的代码

char sth;
int some_function(int arg) {
   int some_int;
   // some code here
}

所以我认为sth位于堆上,some_int位于堆栈上,但arg位于何处? 有人可以解释一下C变量是如何管理的?

谢谢

7 个答案:

答案 0 :(得分:4)

请注意,这一切都取决于实现。 C标准甚至没有说出堆栈,堆等字样。它只讨论了变量所期望的行为,具体取决于其存储(staticexternregister等)。

这样说通常arg将位于为函数提供的堆栈框架中。它的范围仅限于some_int的范围。

顺便说一下,sth不在堆上,它有一个静态的全局存储。

答案 1 :(得分:1)

这里的所有内容完全取决于平台,而且不是关于C语言,而是关于我的编译器是如何实现的。

sth具有静态(全局)存储,因此它可能不在堆上,而是在全局数据段中。 some_int确实位于some_function的本地堆栈框架中。变量arg填充在some_function中,但它所在的位置取决于编译器以及通常所称的“调用约定”:它可以在调用者的堆栈帧中进行分配和清理或被调用者,以及调用者或被调用者,取决于约定,或传入寄存器而根本不进入内存。

答案 2 :(得分:0)

arg将位于堆栈中(至少用于桌面平台)。

阅读一篇名为“粉碎堆栈以获取乐趣和利润”的文档,您将了解如何在C中管理内存。

答案 3 :(得分:0)

sth位于静态内存中,argsome_int位于堆栈中。调用arg时,some_function被复制(“推送”)到堆栈。堆是动态内存,包含在运行时分配的数据(例如,使用malloc)。

答案 4 :(得分:0)

在堆栈上传递参数(极少数例外)。

您应该能够通过执行来验证它们是否在您的计算机体系结构中;

printf("%p - %p\n", &arg, &some_int);

它们通常应该在彼此的几个字节之内。

编辑:正如其他人所说,sth没有在堆上分配,而是在程序的数据段中,即编译器已经在编译时分配了内存。

答案 5 :(得分:0)

某事可能在block static storage(a.k.a。“BSS”,视平台而定):

同样,这完全是“平台相关的”,但通常有四个区域“段”,您可以从中分配变量空间:

a)堆:您的语言的运行时管理“堆”数据,例如调用“malloc()”或“new”)

b)堆栈:这些是“自动”变量

c)BSS:未初始化(可变)静态数据

d)数据:初始化(通常只读)静态数据

http://en.wikipedia.org/wiki/Data_segment

答案 6 :(得分:0)

这取决于实施;参数可以被压入堆栈帧,或者它们可以写入寄存器,或者它们可以通过其他一些机制传递。

语言定义并未规定应存储各种对象的位置;它只强制这些对象应该如何表现。