1

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

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

1 回答 1

4

你所拥有的是一个可变长度数组(VLA),它在 C 标准中是允许的,但在 C++ 中是不允许的。
大多数 C++ 编译器通过编译器扩展提供对它的支持。C++ Standard 提供了一个std::vector通常在 C++ over VLA 中使用的方法,因为使用 VLA 会使您的代码不可移植。

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

当您向 VLA 提供负大小时,您调用的是Undefined Behavior

参考:
C99 标准§6.7.5.2:

如果大小是一个不是整数常量表达式的表达式... ...每次对其进行评估时,它的值都应大于零。

于 2012-08-18T14:20:27.047 回答