在编程领域,某些概念可能会给您留下挥之不去的疑问。其中一个主题是在 C 和 C 中使用可变长度数组 (VLA)。让我们深入研究一些关键点来阐明它们的行为。
VLA 的本地范围声明
正如您所提到的,C99 引入了在本地范围内声明 VLA 的功能。这确实是事实。通过在运行时动态指定数组的大小,您可以像这样创建 VLA:
int main(int argc, char **argv) { int size = 100; int array[size]; return 0; }
全局 VLA 声明的限制
但是,正如您也观察到的, VLA 在 C99 中全局范围内被禁止。这就是你的推理发挥作用的地方。在 C99 中,const 修饰符不保证编译时值。因此,示例中的 global_array 仍然是 VLA,违反了禁令。
但是,在 C 中, const 确实强制执行编译时评估。因此,global_size 成为编译时常量,而 global_array 不再是 VLA。
为什么要限制全局 VLA?
禁止 VLA全球范围源于实际考虑。想象一个全局 VLA,其大小由引用不同编译单元中的对象的表达式确定。确定评估顺序变得具有挑战性,这种复杂的依赖关系可能会导致不可预测的行为。
行为差异
VLA 和数组在全局和局部范围内的行为是确实不同。全局数组具有在编译时确定的固定大小。相比之下,局部作用域中的 VLA 可以根据输入或运行时条件动态调整其大小。
总之,在 C99 及更高版本中,VLA 可以在局部作用域中声明,但不允许在全局作用域中声明一致性和清晰度的原因。全局和局部范围内的数组的行为因其固定或可变大小的特征而有所不同。
以上是C 和 C 中可变长度数组 (VLA) 的规则和限制是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!