堆栈是在运行时还是编译时分配的?
示例:
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
堆栈是在运行时还是编译时分配的?
示例:
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
栈在运行时分配;每个栈帧的布局在编译时决定,除了变量大小数组。
它必须在运行时分配。考虑以下内容:
void a( void )
{
int x;
}
void b( void )
{
int y;
a();
}
int main( void )
{
a();
b();
}
a()函数中的栈内局部变量x的地址在两次调用之间会有所不同。正如blinkenlights所指出的,每个函数栈帧的布局在很大程度上是在编译时确定的,但该栈帧的放置位置则是在运行时确定的。
如果我在我的机器上编译代码,但在你的机器上执行它,你会如何分配编译时间?编译器如何能够预先为你的机器上的堆栈预留内存?
请查看这篇精彩文章
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
这是一篇很好的文章,解释了程序内存的相关知识。您还可以查看该作者关于系统内存行为的其他文章,这将使您对内存的实际工作有更深入的了解。
如果您想了解有关内存的所有内容,请阅读 Ulrich Draper 的这篇论文http://www.akkadia.org/drepper/cpumemory.pdf。
希望这能帮到您!