奇怪的C代码 - 动态数组?

时间:2014-11-24 11:03:27

标签: c

我从一个未知来源复制了一些代码:

 int Len=0;
 printf("Please input the length of vector");
 scanf("%d",&Len);
 float x[Len],y[Len],sig[Len];

现在通常我认为在运行时期间无法使用变量初始化数组。但是,这确实可以编译。问题是我再也不知道编译器了。这是合法的C变种吗?我正在使用的编译器,IAR C,不喜欢它。

我也看到数组从1而不是0索引,这表明这是从Pascal最初的转换。有什么意见吗?

4 个答案:

答案 0 :(得分:4)

  

现在通常我认为在运行时期间无法使用变量初始化数组。

在C99标准之前就是如此。它在C ++中也是非法的(尽管一些编译器,例如gcc,提供它作为扩展)。

  

这是合法的C变种吗?

任何C99编译器都可以。

  

我也看到数组从1而不是0

索引

这也没关系,只要你可以分配一个额外的元素,而不是在索引零处使用元素。

注意:由于访问数组末尾的元素是未定义的行为,因此无效程序可能会起作用并在测试运行中产生所需的结果。如果您怀疑某些数组索引可能会被一个数据删除,请考虑在内存分析器(例如valgrind)下运行您的程序,以查看该程序是否存在与无效内存访问相关的隐藏错误。

答案 1 :(得分:2)

这是C99中引入的一个特性,称为VLA(可变长度数组)。这些数组也从0开始索引,从1开始,在长度为1(在你的情况下为Len-1),就像普通数组一样。

答案 2 :(得分:1)

在C99中,这是有效的,称为VLA阵列。

答案 3 :(得分:1)

这称为可变长度数组(VLA),是C99功能。

如果您的编译器无法识别它自己,那么请尝试切换C标准

尝试:

--std=c99
-std=c99
--std=gnu99
-std=gnu99

编译器的手册页将能够告诉您确切的标记。