我正在准备我的UNIX考试,并且有一个关于C变量的内存位置的问题。 我们假设我们有这样的代码
char sth;
int some_function(int arg) {
int some_int;
// some code here
}
所以我认为sth
位于堆上,some_int
位于堆栈上,但arg
位于何处?
有人可以解释一下C变量是如何管理的?
谢谢
答案 0 :(得分:4)
请注意,这一切都取决于实现。 C标准甚至没有说出堆栈,堆等字样。它只讨论了变量所期望的行为,具体取决于其存储(static
,extern
,register
等)。
这样说通常arg
将位于为函数提供的堆栈框架中。它的范围仅限于some_int
的范围。
顺便说一下,sth
不在堆上,它有一个静态的全局存储。
答案 1 :(得分:1)
这里的所有内容完全取决于平台,而且不是关于C语言,而是关于我的编译器是如何实现的。
sth
具有静态(全局)存储,因此它可能不在堆上,而是在全局数据段中。 some_int
确实位于some_function
的本地堆栈框架中。变量arg
填充在some_function
中,但它所在的位置取决于编译器以及通常所称的“调用约定”:它可以在调用者的堆栈帧中进行分配和清理或被调用者,以及调用者或被调用者,取决于约定,或传入寄存器而根本不进入内存。
答案 2 :(得分:0)
arg将位于堆栈中(至少用于桌面平台)。
阅读一篇名为“粉碎堆栈以获取乐趣和利润”的文档,您将了解如何在C中管理内存。
答案 3 :(得分:0)
sth
位于静态内存中,arg
和some_int
位于堆栈中。调用arg
时,some_function
被复制(“推送”)到堆栈。堆是动态内存,包含在运行时分配的数据(例如,使用malloc
)。
答案 4 :(得分:0)
在堆栈上传递参数(极少数例外)。
您应该能够通过执行来验证它们是否在您的计算机体系结构中;
printf("%p - %p\n", &arg, &some_int);
它们通常应该在彼此的几个字节之内。
编辑:正如其他人所说,sth没有在堆上分配,而是在程序的数据段中,即编译器已经在编译时分配了内存。
答案 5 :(得分:0)
同样,这完全是“平台相关的”,但通常有四个区域“段”,您可以从中分配变量空间:
a)堆:您的语言的运行时管理“堆”数据,例如调用“malloc()”或“new”)
b)堆栈:这些是“自动”变量
c)BSS:未初始化(可变)静态数据
d)数据:初始化(通常只读)静态数据
答案 6 :(得分:0)
这取决于实施;参数可以被压入堆栈帧,或者它们可以写入寄存器,或者它们可以通过其他一些机制传递。
语言定义并未规定应存储各种对象的位置;它只强制这些对象应该如何表现。