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

时间:2015-03-03 14:13:28

标签: c arrays

我试过很多次搜索。静态数组通常存储在堆栈中,并且在编译期间确定它们的大小。 例如:

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

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

2 个答案:

答案 0 :(得分:4)

  

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

可以,但这不是唯一的方法。 C编译器非常智能,可以推迟在自动内存(通常称为“堆栈”)中将此可变长度数组的内存分配到代码中已知数组大小的点

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

答案 1 :(得分:0)

了解有关此特殊情况的标准说明:

C11:6.5.3.4(p2):

  

sizeof运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的括号名称。大小由操作数的类型确定。结果是整数。 如果操作数的类型是可变长度数组类型,则评估操作数;否则,不评估操作数,结果是整数常量。