函数参数的内存位置

问题描述:

我正在准备UNIX考试,并且存在有关C变量的内存位置的问题。 比方说,我们有这样函数参数的内存位置

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

这样的代码,我假设sth位于堆,some_int栈上,但如果位于arg? 有人可以解释C变量是如何管理的?

谢谢

+0

他们都不在堆叠中吗? – 2012-01-11 19:04:27

+0

问:他们都不在堆栈里吗?答:不是,“int some_int”肯定是在堆栈中。 “int arg”肯定是通过堆栈传递的。如果它是一个指针,指针将被传递到堆栈上......但是指向的实际数据可能在任何地方。而“sth”似乎是静态数据,所以它不在堆栈中。 – paulsm4 2012-01-11 19:12:51

请注意,这一切都取决于实施。 C标准甚至不会说出堆栈,堆等字样。它只是根据储存的变量(static,extern,register等)讨论预期的行为。

说了这么多通常arg将位于为功能提供的堆栈帧。它的范围仅限于some_int的范围。

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

这里的一切都完全依赖于平台,而不是关于C语言,而是关于我的编译器如何实现它。

sth有静态(全局)存储,所以它可能不在堆上,而是在全局数据段中。 some_int确实在some_function的本地堆栈帧中。变量arg被填充在some_function之内,但它所处的位置取决于编译器以及通常被称为“调用约定”的地方:它可以在调用者或被调用者的堆栈帧中以及由调用者或者被调用者,这取决于惯例,或者被传入一个寄存器而根本不进入内存。

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

看了一篇名为“德艺双馨堆栈的乐趣和利润”的文件,你会理解记忆是如何在C

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

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

你应该能够通过仅仅做它来验证它们在你的计算机体系结构中;

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

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

编辑:正如其他人已经注意到的,sth不是分配在堆上,而是分配给程序的数据段,即编译器已经在编译时分配了内存。

......可能在block static storage(又名。“BSS”,取决于平台):

同样,这完全是“平台相关”,但一般有四个区域“段”在那里你可以分配变量空间:

一)堆:你的语言的运行时管理“堆”数据,例如通过调用 “的malloc()” 或 “新的”)

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

c)中BSS:unintialized(变量)的静态数据

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

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

这取决于执行情况;参数可能被压入栈帧,或者它们可能被写入寄存器,或者它们可能被其他机制传递。

语言定义并没有规定应该存储各种对象的位置;它只是要求这些对象应该如何表现。