0

我知道内存是在编译时分配给自动变量的,例如int a;并存储在堆栈中,但如果是变量数组的输入是从用户那里获取的,例如

#include<stdio.h>
main()
{
 int n;
 printf("enter the size of array");
 scanf("%d",&n);
 int a[n];
 .......
}

内存是在运行时分配的。所以我的问题是,自动分配是否取决于大小写。谢谢

4

2 回答 2

1

处理自动分配的代码是在编译时创建的。实际分配发生在运行时。您将拥有诸如“将变量压入堆栈”或“将变量放入寄存器”之类的机器代码,但是在执行程序之前,该代码当然什么也不做。所有堆栈分配都是在运行时完成的。它们可能具有也可能不具有确定性。

在 VLA 的情况下,指令“移动堆栈指针 n 步”是在编译时创建的,但变量n是在运行时设置的,然后相应地移动堆栈指针,以分配内存。

在编译时发生的唯一类型的分配是具有静态存储持续时间的对象的分配 - 意味着文件范围变量和static变量的分配。这些空间保留在通常命名的数据段.data.bss大多数系统上。

可以在此处找到示例。

于 2017-12-21T08:56:01.857 回答
1

在您的示例中,不清楚“a”的定义位置。因此,我将通过对此做出假设来尝试回答这个问题。

  1. 如果数组被声明为全局数组,则它驻留在 bss 段中,并且在将段加载到内存时分配内存。
  2. 如果数组在堆栈上,并且数组的大小在编译时已知,则移动堆栈指针以为数组分配空间。如果您反汇编代码,您可以看到这一点。
  3. 如果数组在堆栈上,但是根据函数的参数分配空间,则您有一个 VLA(可变长度数组)。这些通常由编译器转换为“alloca”调用。在这种情况下,堆栈指针只是移动到堆栈上分配的“n”个字节。
  4. 如果数组在堆上,则分配由正在使用的堆分配器执行。
于 2017-12-21T00:36:35.677 回答