C语言中的变长数组

6
我猜我的问题是以下内容是否为有效的C语言。
int main(void) {
  int r = 3;
  int k[r];
  return 0;
}

如果可以的话,有没有人能解释一下为什么这段代码在微软的C编译器中不能运行,但在GCC中可以,并且当它被添加到C标准中时也可以运行。
谢谢。
5个回答

13

C99中支持,MSVC仅支持C89。


9

C99标准引入了可变长度数组,但其他供应商(如GCC)早在此之前就已经添加了它们。


4

很抱歉这不是一个答案,但我想指出使用可变长度数组可能存在的问题。我遇到的大多数代码看起来像这样。

void foo(int n)
{
    int bar[n];
    .
    .
}

这里没有明确的错误检查。一个较大的 n 可能会导致问题。

3

这是GCC的一个扩展,当前的MSVC不支持。你可以用MSVC中的_alloca相对容易地替换它(_alloca是一种堆栈分配方式,程序员不需要手动释放):

#include <malloc.h>

...

int *k = (int *)_alloca(sizeof(*k)*r);

4
这是GCC的一个扩展功能,但已被纳入C99标准。然而,MSVC目前尚未支持该功能。此外,在Linux上使用的是alloca()而不是_alloca,并且在<alloca.h>头文件中。 - bdonlan
我一直使用这个,但直到我使用 Windows 才出现了错误这解决了我的困惑。 - adk

0

这是GCC的扩展,当前的MSVC不支持。您可以在MSVC中使用_alloca进行替换(一种堆栈分配方式,程序员无需手动释放)。

是的,但它的限制是1MB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接