在C中使用静态数组声明分配动态数组?

时间:2015-04-09 01:32:27

标签: c arrays

例如,

int aaa(unsigned int par1, unsigned int par2){
  int array[par1*par2];
  return 0;
}

我尝试编译包含此代码的代码,编译得很好并且没有运行时问题 - 数组已正确创建。

但我知道这基本上是以静态数组声明方式声明动态数组。这个宣言可能出现什么问题?在不同的编译器中是否会出现编译器问题?

3 个答案:

答案 0 :(得分:5)

根据1999 C标准,这是正确的。 2011标准将其更改为可选功能,实际上这意味着除MSVC外,所有C11编译器都支持它。

在1999年之前,一些编译器将此作为非标准扩展提供。

Here is a link向StackOverflow搜索有关此主题的其他问题。

答案 1 :(得分:2)

  

但我知道这基本上是以静态数组声明方式声明动态数组。

这称为VLA (可变长度数组)。这个数组是静态的 - 它被放置在自动内存中(也称为“堆栈”)。

  

此声明可能出现什么问题?

当阵列大小超过特定于系统的特定限制时,它可能会溢出堆栈。

  

在不同的编译器中是否会出现编译器问题?

这是C99功能,因此不支持C99的编译器可能无法编译此代码。

答案 2 :(得分:0)

我相信这是仅限C99的功能。它被称为VLA (variable-length arrays)

C ++ 0x不支持VLA: https://groups.google.com/forum/#!topic/comp.std.c++/K_4lgA1JYeg

但有些编译器可能不严格遵守标准。