函数参数的内存位置
我正在准备UNIX考试,并且存在有关C变量的内存位置的问题。 比方说,我们有这样函数参数的内存位置
char sth;
int some_function(int arg) {
int some_int;
// some code here
}
这样的代码,我假设sth
位于堆,some_int
栈上,但如果位于arg
? 有人可以解释C变量是如何管理的?
谢谢
请注意,这一切都取决于实施。 C标准甚至不会说出堆栈,堆等字样。它只是根据储存的变量(static
,extern
,register
等)讨论预期的行为。
说了这么多通常arg
将位于为功能提供的堆栈帧。它的范围仅限于some_int
的范围。
顺便说一句sth
不在堆上它有一个静态的全局存储。
这里的一切都完全依赖于平台,而不是关于C语言,而是关于我的编译器如何实现它。
sth
有静态(全局)存储,所以它可能不在堆上,而是在全局数据段中。 some_int
确实在some_function
的本地堆栈帧中。变量arg
被填充在some_function
之内,但它所处的位置取决于编译器以及通常被称为“调用约定”的地方:它可以在调用者或被调用者的堆栈帧中以及由调用者或者被调用者,这取决于惯例,或者被传入一个寄存器而根本不进入内存。
arg将位于堆栈中(至少适用于桌面平台)。
看了一篇名为“德艺双馨堆栈的乐趣和利润”的文件,你会理解记忆是如何在C
sth
管理是在静态存储器,arg
和some_int
是在栈中。当调用some_function
时,arg
被复制(“推送”)到堆栈。堆是动态内存,包含运行时分配的数据(例如使用malloc
)。
在堆栈上传递的参数(极少数例外)。
你应该能够通过仅仅做它来验证它们在你的计算机体系结构中;
printf("%p - %p\n", &arg, &some_int);
它们通常应该在彼此的几个字节之内。
编辑:正如其他人已经注意到的,sth不是分配在堆上,而是分配给程序的数据段,即编译器已经在编译时分配了内存。
......可能在block static storage(又名。“BSS”,取决于平台):
同样,这完全是“平台相关”,但一般有四个区域“段”在那里你可以分配变量空间:
一)堆:你的语言的运行时管理“堆”数据,例如通过调用 “的malloc()” 或 “新的”)
B)堆栈:这些是 “自动” 变量
c)中BSS:unintialized(变量)的静态数据
d)数据:初始化(通常只读)静态数据
这取决于执行情况;参数可能被压入栈帧,或者它们可能被写入寄存器,或者它们可能被其他机制传递。
语言定义并没有规定应该存储各种对象的位置;它只是要求这些对象应该如何表现。
他们都不在堆叠中吗? – 2012-01-11 19:04:27
问:他们都不在堆栈里吗?答:不是,“int some_int”肯定是在堆栈中。 “int arg”肯定是通过堆栈传递的。如果它是一个指针,指针将被传递到堆栈上......但是指向的实际数据可能在任何地方。而“sth”似乎是静态数据,所以它不在堆栈中。 – paulsm4 2012-01-11 19:12:51