是在运行时还是编译时分配堆栈? 例如:
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
答案 0 :(得分:5)
Stack在运行时分配;但是,每个堆栈帧的布局在编译时决定,除了可变大小的数组。
答案 1 :(得分:2)
你会如何分配编译时间?如果我在我的机器上编译代码但是在你的机器上执行它,编译器如何能够为你机器上的堆栈预分配内存?
答案 2 :(得分:2)
This应该有所帮助。堆栈内存在运行时分配。
请记住,它必须在运行时分配,因为编译器无法知道调用函数的次数,执行while循环的次数,或其他任何内容。
答案 3 :(得分:2)
必须在运行时分配。请考虑以下事项:
void a( void )
{
int x;
}
void b( void )
{
int y;
a();
}
int main( void )
{
a();
b();
}
a()中stack-local x的地址在两次调用之间会有所不同。正如blinkenlights指出的那样,每个函数的堆栈帧的布局很大程度上是在编译时确定的,但该帧的位置是在运行时确定的。
答案 4 :(得分:1)
总是在运行时分配堆栈,您需要堆栈来执行方法而不是编译。
答案 5 :(得分:1)
为了补充所有其他答案(在一般情况下是正确的),理论上有时可以在编译时分配堆栈(取决于您对“分配”的定义)。
具体来说,如果你的程序没有函数指针或递归,那么可以使用静态分析来计算出所需的最大堆栈大小。实际上,一些嵌入式编译器就是这样做的。
答案 6 :(得分:0)
当然堆栈是在运行时分配的。您需要堆栈内存来执行code.ec
检查link,讨论C程序的内存布局。
答案 7 :(得分:0)
查看这篇精彩的文章
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
这是一个很好的写作,它解释了程序存储器。 您还可以查看同一作者关于s系统中内存行为的其他文章,这将使您深入了解内存中的实际工作。
如果你想了解关于记忆的一切,请尝试阅读Ulrich Draper撰写的这篇论文 http://www.akkadia.org/drepper/cpumemory.pdf
希望这有帮助!