Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的可变大小数组_C_Arrays - Fatal编程技术网

C语言中的可变大小数组

C语言中的可变大小数组,c,arrays,C,Arrays,我想我的问题是下面的C是否有效 int main(void) { int r = 3; int k[r]; return 0; } 如果是这样的话,有人愿意解释为什么它不能在微软的C编译器中工作,而是在GCC中工作,以及它是何时被添加到C标准中的 谢谢它在C99中。MSVC仅支持C89。添加的可变长度数组,但其他供应商(如GCC)在更早的时候添加了它们。这是当前MSVC不支持的GCC扩展。您可以在MSVC中相当轻松地用_alloca(一种不需要程序员手动解除分配的堆栈分配)替换它:

我想我的问题是下面的C是否有效

int main(void) {
  int r = 3;
  int k[r];
  return 0;
}
如果是这样的话,有人愿意解释为什么它不能在微软的C编译器中工作,而是在GCC中工作,以及它是何时被添加到C标准中的


谢谢

它在C99中。MSVC仅支持C89。

添加的可变长度数组,但其他供应商(如GCC)在更早的时候添加了它们。

这是当前MSVC不支持的GCC扩展。您可以在MSVC中相当轻松地用_alloca(一种不需要程序员手动解除分配的堆栈分配)替换它:

#包括
...
int*k=(int*)\u alloca(sizeof(*k)*r);

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

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

这里没有明确的错误检查。大型的
n
很容易引起问题。

它是当前MSVC不支持的GCC扩展。您可以在MSVC中相当容易地用_alloca(一种不需要程序员手动解除分配的堆栈分配)替换它


是的,但它被限制为1mb

它是一个GCC扩展,但被编入C99。MSVC确实还不支持它。还要注意的是,在Linux上,它是alloca(),而不是_alloca,并且在中。我一直使用它,但直到我使用windows时才发现错误。这消除了我的困惑
void foo(int n)
{
    int bar[n];
    .
    .
}