声明可变大小的数组时出现意外的编译器行为

时间:2015-01-26 13:26:45

标签: c++ c arrays gcc variable-length-array

所以,我正在向学生教授基础C编程以进行测试。

谈到阵列声明,我告诉他:

"你可以这样做"

int myArray[10];

- >告诉他代码编译

"你也可以这样做"

#define ARRAY_SIZE 10
[...]
int myArray[ARRAY_SIZE];

- >告诉他代码编译

"但你不能这样做!"

int arraySize = 10;
int myArray[arraySize];

- >告诉他代码不会编译......但它实际上编译了!

myWholeLifeIsALie.jpg

我正在使用DevC ++和MinGW。

出汗,我打开Linux并制作了一个简单的测试程序

#include <stdio.h>

int main()
{
  int size;
  int i;

  scanf("%d", &size);

  int array[size];

  for(i = 0; i < size; i++)
    array[i] = i*2;

  return 0;
}

它使用g ++和gcc编译并运行。

相反,MS Visual Studio 2010编译器告诉我他&#34;期望常量表达&#34;。这也是我对g ++ / gcc的期望。

我想我在这里失去了一些愚蠢的东西,但我甚至不能......

2 个答案:

答案 0 :(得分:2)

标准C ++不支持可变长度数组(长度由变量的运行时值确定)。

然而,自1999年以来,它们在标准C中得到支持。一些C编译器早于1999年,一些C ++编译器支持VLA(或类似功能)作为扩展。

某些编译器产品/套件(例如gcc)具有选择支持特定C或C ++标准的选项,并且可以选择它们是多么挑剔(例如,它们为其发出诊断或警告的构造)。

有必要阅读您的编译器文档,以确定默认情况下它支持的标准或供应商特定语言功能,如何更改这些功能以及如何进行诊断。

答案 1 :(得分:0)

不,先生,您的WholeLifeIsNotALie.jpg也在那里。 : - )

是的,C可以这样做。鉴于编译器支持C99,它允许调用VLA [可变长度数组]。

我对c++知之甚少,但如果它正式支持,它应该在最新标准中定义,否则支持作为编译器扩展。

SideNote:您应该始终检查scanf()的返回值以确保正确输入。否则,你可能会遇到奇怪的事情。