c - ISO C90 禁止可变长度数组

标签 c variable-length-array

我正在动态计算数组的大小。像这样的东西:

void foo(size_t limit)
{
  char buffer[limit * 14 + 1];
}

但只是 GCC 编译器说:

error: ISO C90 forbids variable length array ‘buffer’

搜索 SO 我找到了 this answer :

C99 §6.7.5.2:

If the size is an expression that is not an integer constant expression... ...each time it is evaluated it shall have a value greater than zero.

因此,我将大小限制类型变量重新声明为:

void foo(const size_t limit)

但它继续给我警告。这是 GCC 错误吗?

最佳答案

const - 限定变量不会使其成为编译时常量(有关整数常量表达式的定义,请参阅 C99 6.6 §6),以及之前随着 C99 引入可变长度数组,数组大小需要成为编译时常量。

很明显,const 限定变量不会使其成为编译时常量,特别是在调用函数之前不会初始化的函数参数的情况下。

我看到了以下针对您的问题的解决方案:

  • 通过 -std=c99-std=gnu99 将您的代码编译为 C99>
  • 通过malloc()分配您的缓冲区
  • 如果可用,请使用 alloca(),这是最接近 C90 可变长度数组的方法
  • 选择一个始终使用的最大缓冲区大小,如果给定的 limit 参数溢出则失败

作为旁注,即使 C99 允许可变长度数组,使用具有静态存储持续时间的整数变量的值作为具有静态存储持续时间的数组的大小仍然是非法的,无论 const-qualification:如果整数变量在同一个翻译单元中初始化,原则上没有什么可以阻止这一点,但您必须从那些定义驻留在不同翻译单元中的变量中获得具有可见定义的特殊情况变量,并且要么必须禁止临时定义或需要多次编译通过,因为在整个翻译单元被解析之前,临时定义变量的初始化值是未知的。

关于c - ISO C90 禁止可变长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234288/

相关文章:

c - 代表另一个或多个字符的 3 个字符构造的名称是什么

java - PPP 的免费 C/C++ 和 Java 实现?

c - GDB C 如何打印 VLA 条目(动态数组)

c - 带有for循环和if语句错误的斐波那契数代码

c++ - 如何使程序声明可变数量的不确定大小的数组

c - 正确分配多维数组

C 中数组初始化的困惑

c++ - 在函数之间来回传递 char*

c++ - 测量 CPU 频率缩放效果

c - sizeof 运算符与可变长度数组一起作为函数参数