我是C程序员和使用
gcc(Ubuntu / Linaro 4.7.3-1ubuntu1)4.7.3
下面的静态数组正在工作
int i=10; int a[i];
它的工作正常,但根据我应该给这种types的数组声明错误,任何机构可以告诉我这是什么行为?
你是对的 – 根据C99标准 ,第6.7.5.2节,第2部分,静态数组不能声明为可变长度:
只有一个普通的标识符(如6.2.3所定义的)同时具有块范围或函数原型范围,而且没有连接,应该有一个可变的修改类型。 如果一个标识符被声明为具有
static
存储持续时间的对象,则它不应该具有可变长度的数组类型。 (强调加)
#include <stdio.h> int i = 5; int a[i]; // <<== ERROR - this does not compile
( 演示显示此错误 )
对于非静态数组(例如自动存储区域中的数组,也称为“堆栈”),这是允许的。 而且,你甚至可以从你的函数之外传递i
:
void test(int i) { int a[i]; // C99 allows this; gcc allows this in c90 as well. }
gcc允许C90中的可变长度数组作为扩展 。
这是C99及更高版本的标准行为。
这些被称为VLA(可变长度阵列)。
显然你使用的C编译器比你期望的更现代:)
int i=10; int a[i];
这在块范围(即在函数内部)是有效的,但是在文件范围(即在函数体外部)是无效的。 在块范围内,它被称为可变长度数组,它是C99引入的一个特征。