我知道内存在编译时被分配给像int a;
这样的自动变量并且存储在堆栈中但是在变量数组的情况下,其输入来自用户,例如
#include<stdio.h>
main()
{
int n;
printf("enter the size of array");
scanf("%d",&n);
int a[n];
.......
}
内存在运行时分配。所以我的问题是,自动分配是否依赖于案例。谢谢
在您的示例中,不清楚“a”的定义位置。所以,我会通过对此做出假设来尝试回答这个问题。
处理自动分配的代码是在编译时创建的。实际分配在运行时进行。您将拥有机器代码,例如“在堆栈上推送变量”或“将变量放入寄存器”,但是在执行程序之前,此代码当然无效。所有堆栈分配都在运行时完成。它们可能是也可能不是确定性的。
在VLA的情况下,在编译时创建指令“移动堆栈指针n步”,但是在运行时设置变量n
,然后相应地移动堆栈指针以分配存储器。
在编译时发生的唯一分配是分配具有静态存储持续时间的对象 - 意味着分配文件范围变量和static
变量。这些空间保留在大多数系统中通常命名为.data
和.bss
的数据段中。
例子可以找到here。