6.7.7.3 数组声明符
约束
[与]中可以放:- 大小表达式;
*;- 以及形参数组最外层允许的限定符和
static。
若写的是大小表达式,则它必须具有整数类型。
若大小表达式是常量表达式,则其值必须大于
0。元素类型不能是不完整类型,也不能是函数类型。
static和写在[]里的限定符,只能出现在函数形参的最外层数组派生中。若标识符被声明为变长修改类型,则它必须:
- 是普通标识符;
- 没有链接;
- 处于块作用域或函数原型作用域。
具有静态存储期或线程存储期的对象不能是变长数组类型。
语义
数组声明符会把基础类型改造成“元素类型为
T的数组”。若大小省略,则数组类型是不完整类型。
若大小写成
*,得到的是未指定大小的变长数组类型;这种写法只能用于函数声明(非定义)中的参数声明链。若大小不是整数常量表达式,则:
- 在函数原型作用域中,它按
*处理; - 在其他作用域中,每次求值都必须得到大于
0的值。
- 在函数原型作用域中,它按
某个变长数组对象一旦建立,其生命周期内大小不再变化。
两个数组类型要兼容,必须元素类型兼容;若双方都给出整数常量表达式大小,则大小也必须相同。
若在要求类型兼容的上下文中,两边大小表达式运行时求得不同值,则行为未定义。
读者需要特别注意的点
extern int *x;与extern int y[];完全不同:x是指向int的指针;y是未知大小的int数组。
文件作用域不能声明变长数组,也不能声明指向 VLA 的有链接标识符。
块作用域可以声明:
- 自动存储期的 VLA;
- 自动存储期的“指向 VLA 的指针”;
- 以及静态存储期的“指向 VLA 的指针对象”。
结构体或联合体成员不能是变长修改类型。