长度由 C 中的变量定义的数组如何存储在内存中?

Sri*_*hat 3 c arrays

我试过很多次搜索这个。静态数组通常存储在堆栈中,它们的大小在编译时确定。前任:

int main()
{
    int n;
    scanf("%d", &n);
    int array[n];
    printf("%u", sizeof(array));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

数组的大小随 n 的不同值而变化。因此,这里的数组不应该存储在堆中,因为大小是在运行时确定的吗?一直对此感到困惑。请帮忙。谢谢你!

das*_*ght 5

此处的数组不应该存储在堆中,因为大小是在运行时确定的吗?

可能,但不这样做的唯一途径。C 编译器足够聪明,可以将自动内存(通常称为“堆栈”)中这个可变长度数组的内存分配推迟到代码中知道数组大小的点。

为了使这成为可能,sizeof需要创建一个相关的技巧。通常,sizeof在编译时进行评估;然而,可变长度数组改变了这一点,要求sizeof在运行时评估 VLA 上的表达式。同样,编译器通过将 VLA 的实际大小存储在内存中单独的隐藏位置,为此提供了“启用技术”。