让我们考虑以下代码:
#include <stdio.h>
int main(){
int size,i;
scanf("%d",&size);
int x[size];
for(i=0;i<size;i++){
x[i] = i;
}
for(i=0;i<size;i++){
printf("%d\n", x[i]);
}
return 0;
}
我认为有些版本中我们无法使用变量定义数组的大小来声明数组,例如:
int x[size];
但是我不确定哪个版本。 所谓的ANSI C中允许这样做吗?
答案 0 :(得分:6)
在C89 / C90中,即使将维度更改为编译时间常数,也无法交错声明和语句,例如将int x[size];
声明(定义)放在scanf()
之后。
在C89 / C90中,不能使用可变长度的数组-由于int x[size];
不是编译时间常数,因此size
的定义是不合法的。
要求C99编译器既支持函数(几乎)任意点的声明(它们仍然不能带有标签)和可变长度数组(VLA)定义。
C11编译器必须(几乎)在函数中的任何位置支持变量定义。 C11编译器可以选择支持VLA(§6.10.8.3 Conditional feature macros和§6.7.6.2 Array declarators),如果不支持,则应定义__STDC_NO_VLA__
。
C18等同于C11。
仅作记录:
当然,关于X3.159-1989的唯一不寻常的事情是,它是在有ISO标准之前由ANSI发布的。但是,ANSI以及其他国家标准机构(例如BSI(英国标准协会)和DIN(德国规范学会或德国标准化研究所))也都采用了每个后续的ISO标准。
1994年完成并于1995年发布的修正案1(针对ISO 9899:1990)也进行了修订。该修正案添加了标题,引入了有向图,并对其他内容进行了其他更改。几乎从来没有单独考虑过它,尤其是25年后的现在。
请注意,GCC将-ansi
选项等同于-std=c90
,这可能导致术语混淆。 ANSI比ISO早一年左右就发布了“ ANSI C标准”,但目的总是要有一个通用标准,并且ANSI在发布时就认可了ISO 9899:1990标准。
答案 1 :(得分:0)
在C99中添加了这种称为可变长度数组的数组。 请查看有关现代C编程的这篇不错的文章:
答案 2 :(得分:-1)
ANSI-C(C89)不允许使用变量初始化数组。
例如:
int x = 5;
int ia[x];
以上示例是非法的。 ANSI-C将数组初始化大小限制为恒定。但是,您可以使用宏来定义数组的长度。
示例:
#define MAX_ARRAY_SIZE 5
int ia[MAX_ARRAY_SIZE];