数组声明和内存布局

时间:2012-08-18 14:14:37

标签: c++ c memory operating-system

我知道如果数组是本地的,则在堆栈中分配大小。如何在代码中将内存分配给后续数组。此外,当我给-20输入负输入时,答案是-80。它用于在早期编译器中给出错误但现在不是。那么它现在如何处理呢?

int main()
{
  int i;
  scanf("%d",&i);
int a[i];
printf("%d",sizeof(a));
}

1 个答案:

答案 0 :(得分:4)

你拥有的是 Variable length array(VLA) ,这在C标准中是允许的,但在C ++中则不允许。
大多数C ++编译器通过编译器扩展为它提供支持。 C ++标准提供了一个std::vector,它通常用于C ++而不是VLA,因为使用VLA会使您的代码不可移植。

对于用户程序,VLA的元素位于连续的内存位置,就像普通数组一样。唯一的区别是可以在运行时指定数组的长度。

当您为VLA提供负面大小时,您调用的内容是未定义行为

<强>参考:
C99标准§6.7.5.2:

  

如果size是一个不是整数常量表达式的表达式......每次计算它时,它的值应大于零。