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