2014-11-24 84 views
2

我有一个比特的来自未知源复制的代码:奇怪的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,这表明这是从帕斯卡原来的东西翻译。有什么意见?

+0

为什么你认为它不能? Array不管任何编译器从0开始。 – SMA 2014-11-24 11:07:35

回答

4

现在通常我认为数组不能在运行期间用变量初始化。

在C99标准之前就已经如此。这在C++中也是非法的(尽管一些编译器,如gcc,将其作为扩展)。

有没有一个C变体,这是合法的?

任何C99编译器都可以。

我也看到从1索引的数组,而不是0

这是OK为好,只要你是精分配一个额外的元素,并且在指数为零没有使用的元素。

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

+0

我认为c应该是C++的一个子集 – Julius 2014-11-24 11:08:36

+1

@Julius你从哪里得到这个想法? – 2501 2014-11-24 11:09:38

+0

好的 - 我将检查我的编译器设置并确保它与C99兼容。至于从1开始索引的数组,因为它显然是可行的,即.exe做它应该做的事情,所以我会离开它。该源本身是一个非法的高斯曲线拟合代码片。 – 2014-11-24 11:09:58

2

这是C99中引入的功能,称为VLA(可变长度阵列)。这些数组也是索引,从0开始,不是1,结束于长度为1(在您的情况下为Len-1),就像普通数组一样。

1

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

1

这被称为可变长度阵列(VLA)并且是C99特征。

如果编译器不能识别它在它自己的再尝试切换C类标准

尝试:

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

你的编译器的手册页就能告诉你确切的标志。