Tag: 可变长度数组

ISO C90禁止可变长度arrays

我正在动态计算数组的大小。 就像是: void foo(size_t limit) { char buffer[limit * 14 + 1]; } 但只是GCC编译器说: error: ISO C90 forbids variable length array ‘buffer’ 搜索SO我发现这个答案 : C99§6.7.5.2: 如果size是一个不是整数常量表达式的表达式……每次计算它时,它的值应大于零。 所以,我做了大小限制类型变量的重新声明: void foo(const size_t limit) 但它继续给我警告。 这是GCC的错误吗?

C中不支持可变长度数组C99

在Visual Studio 2005中,我正在尝试编译.c文件: int i = 6; int a[i]; 它不起作用,我的编译器遵循哪个标准?

无论如何,VLA有什么意义?

我理解变长数组是什么以及它们是如何实现的。 这个问题是关于它们存在的原因。 我们知道VLA只允许在function块(或原型)中使用,并且它们基本上不能在堆栈上的任何地方(假设正常实现):C11,6.7.6.2-2: 如果标识符被声明为具有可变修改类型,则它应该是普通标识符(如6.2.3中所定义),没有链接,并且具有块范围或函数原型范围。 如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型。 我们举一个小例子: void f(int n) { int array[n]; /* etc */ } 有两种情况需要注意: n <= 0 : f必须防止这种情况,否则行为是不确定的:C11,6.7.6.2-5(强调我的): 如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为*被替换为* ; 否则, 每次评估它时,其值应大于零 。 变长数组类型的每个实例的大小在其生命周期内不会改变。 如果size表达式是sizeof运算符的操作数的一部分,并且更改size表达式的值不会影响运算符的结果,则无法指定是否计算size表达式。 n > stack_space_left / element_size :没有标准的方法来查找剩余多少堆栈空间(因为只要涉及标准就没有堆栈这样的东西)。 所以这个测试是不可能的。 只有明智的解决方案是为n设置一个预定义的最大可能大小,比如N ,以确保不会发生堆栈溢出。 换句话说,程序员必须确保0 < n <= N才能选择N 但是,无论如何,程序应该适用于n == N ,因此也可以使用常量大小N而不是可变长度n声明数组。 我知道引入了VLA以替换alloca (也在本回答中提到),但实际上它们是相同的(在堆栈上分配可变大小的内存)。 所以问题是为什么alloca和VLA存在,为什么他们不被弃用? 在我看来,使用VLA的唯一安全方法是使用有限大小,在这种情况下,采用具有最大大小的正常arrays始终是可行的解决方案。

`sizeof`的操作数是用VLA评估的吗?

这个答案的评论部分中的一个论点促使我提出这个问题。 在以下代码中, bar指向可变长度数组,因此sizeof是在运行时而不是编译时确定的。 int foo = 100; double (*bar)[foo]; 参数是关于当操作数是可变长度数组时是否使用sizeof评估其操作数,使得当未初始化bar时, sizeof(*bar)未定义行为。 是否使用sizeof(*bar)是未定义的行为,因为我正在取消引用未初始化的指针? 当类型是可变长度数组时,是否实际评估了sizeof的操作数,还是只确定了它的类型( sizeof通常如何工作)? 编辑:每个人似乎都在引用C11选秀中的这段话 。 有谁知道这是否是官方标准中的措辞?

malloced数组VS. 变长数组

有两种方法可以为数组分配内存,其大小在开始时是未知的。 最常见的方法是使用像这样的malloc int * array; … // when we know the size array = malloc(size*sizeof(int)); 但是在我们知道尺寸后,在C99中定义数组也是有效的。 … // when we know the size int array[size]; 他们完全一样吗?

使用可变长度数组是否安全?

我对可变长度数组感到担忧。 当我想动态分配一个数组时,如果不能分配足够的内存,我将得到null,我可以在程序中正确响应。 使用可变长度数组我不会得到这些信息。 我该怎么办?

在MS Visual C ++中启用VLA(可变长度数组)?

如何在MS Visual C ++中启用使用C99中定义的VLA或可变长度数组,或者根本不可能? 是的我知道C ++标准是基于C89的,并且VGA在C89标准中不可用,因此在C ++中不可用,但MSVC ++也应该是C编译器,可以使用/ TC编译器参数( Compile as C Code (/TC) )。 但这样做似乎并没有启用VLA,并且编译过程在构建为C ++( Compile as C++ Code (/TP) )时会出现相同的错误。 也许MSVC ++ C编译器只符合C89或者我缺少一些东西(一些特殊的构造或pragma / define)? 代码示例: #include int main(int argc, char **argv) { char pc[argc+5]; /* do something useful with pc */ return EXIT_SUCCESS; } 编译错误: 错误C2057:预期的常量表达式 错误C2466:无法分配常量大小为0的数组 错误C2133:’pc’:未知大小