13

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

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

8 回答 8

11

堆栈在运行时分配;但是,每个堆栈帧的布局是在编译时决定的,可变大小数组除外。

于 2012-05-30T18:36:49.263 回答
4

它必须在运行时分配。考虑以下:

void a( void )
{
    int x;
}

void b( void )
{
    int y;
    a();
}

int main( void )
{
    a();
    b();
}

a() 中堆栈本地 x 的地址在其两次调用之间将不同。正如blinkenlights 所指出的,每个函数的堆栈帧的布局在很大程度上是在编译时确定的,但该帧的位置是在运行时确定的。

于 2012-05-30T18:39:22.807 回答
2

你将如何分配编译时间?如果我在我的机器上编译代码但在你的机器上执行它,编译器如何能够为你机器上的堆栈预分配内存?

于 2012-05-30T18:38:31.703 回答
2

应该会有所帮助。堆栈内存是在运行时分配的。

请记住,它必须在运行时分配,因为编译器无法知道函数被调用了多少次,或者 while 循环执行了多少次,等等。

于 2012-05-30T18:38:43.630 回答
1

为了补充所有其他答案(在一般情况下是正确的),理论上有时可以在编译时分配堆栈(取决于您对“分配”的定义)。

具体来说,如果您的程序没有函数指针或递归,那么可以使用静态分析来确定所需的最大堆栈大小。事实上,一些嵌入式编译器正是这样做的。

于 2012-05-30T18:46:22.213 回答
1

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

在相似的线路上

于 2012-05-30T18:35:06.580 回答
0

看看这篇很棒的文章

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

这是一篇很棒的文章,解释了程序存储器。您还可以查看同一作者关于 s 系统中的内存行为的其他文章,这将使您深入了解内存中的实际工作。

如果您想了解有关内存的所有信息,请尝试阅读 Ulrich Draper 的这篇论文 http://www.akkadia.org/drepper/cpumemory.pdf

希望这可以帮助!

于 2012-05-30T19:47:21.267 回答
0

当然堆栈是在运行时分配的。您需要堆栈内存来执行 code.ec

检查讨论 C 程序的内存布局的此链接。

于 2012-05-30T18:35:43.820 回答