我试过很多次搜索。静态数组通常存储在堆栈中,并且在编译期间确定它们的大小。 例如:
int main()
{
int n;
scanf("%d", &n);
int array[n];
printf("%u", sizeof(array));
return 0;
}
对于不同的n值,数组的大小会发生变化。因此,这里的数组不应该存储在堆中,因为大小是在运行时确定的吗?一直对此感到困惑。请帮忙。谢谢!
答案 0 :(得分:4)
这里的数组不应该存储在堆中,因为大小是在运行时确定的吗?
可以,但这不是唯一的方法。 C编译器非常智能,可以推迟在自动内存(通常称为“堆栈”)中将此可变长度数组的内存分配到代码中已知数组大小的点
为了实现这一点,需要创建sizeof
的相关技巧。通常,sizeof
在编译时进行评估;但是,可变长度数组改变了这一点,要求在运行时评估VLA上的sizeof
表达式。同样,编译器通过将VLA的实际大小存储在内存中的单独隐藏位置来为其提供“启用技术”。
答案 1 :(得分:0)
了解有关此特殊情况的标准说明:
sizeof
运算符产生其操作数的大小(以字节为单位),可以是 表达式或类型的括号名称。大小由操作数的类型确定。结果是整数。 如果操作数的类型是可变长度数组类型,则评估操作数;否则,不评估操作数,结果是整数常量。