我从一个未知来源复制了一些代码:
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最初的转换。有什么意见吗?
答案 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
编译器的手册页将能够告诉您确切的标记。