下面的代码片段在C中工作和编译
const int n=10;
int main(void)
{
int a[n];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当在全局范围内声明数组时,它会引发编译错误.
const int n=10;
int a[n];
int main(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么它不会在主要内部抛出错误.
尽管n被标记为const,但它不是编译时常量1.因此,阵列a是可变长度阵列2.
VLA不能有静态存储时间.将它放在文件范围使它成为一个静态变量,并且你的程序因为它而形成错误3.
整数常量表达式117)应具有整数类型,并且只应具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,_Alignof表达式以及作为强制转换的直接操作数的浮动常量.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分.
如果大小不存在,则数组类型是不完整类型.如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,它只能用于具有函数原型范围的声明或类型名称; 143)此类数组仍然是完整类型.如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型.
如果标识符被声明为具有可变修改类型,则它应该是普通标识符(如6.2.3中所定义),没有链接,并且具有块范围或函数原型范围.如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型.