堆栈内存是在运行时还是编译时分配的?

时间:2012-05-30 18:33:22

标签: c stack-memory

是在运行时还是编译时分配堆栈? 例如:

void main()
{
    int x;
    scanf("%d", &x);
    int arr[x];
}

8 个答案:

答案 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)

总是在运行时分配堆栈,您需要堆栈来执行方法而不是编译。

On Similar Lines

答案 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

希望这有帮助!