我的印象是在C89中无法实现可变大小的数组声明.但是,在编译时,clang -ansi我能够运行以下代码:
double array[] = { 0.0, 1.0, 2.0, 3.0, 4.0 };
double other_array[sizeof(array)] = { 0.0 };
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?那不被认为是可变大小的数组声明吗?
在ANSI C89又名ISO C90中,sizeof运算符产生一个整数常量,适用于数组维度.例如,函数调用不是.
我想补充一句话,因为我认为代码原样有一个可能被忽视的问题.
如果other_array声明为
double other_array[sizeof(array)];
Run Code Online (Sandbox Code Playgroud)
它既不会具有相同数量的元素,也不会具有相同的大小(对于数组而言只适用于char)array[].如果目的是声明具有相同数量元素的第二个数组(无论类型如何),请使用:
double other_array[sizeof(array)/sizeof(*array)];
Run Code Online (Sandbox Code Playgroud)
这是因为sizeof运算符的结果是常量表达式,因此它不符合VLA的条件,就像下面的声明一样:
int other_array[5];
Run Code Online (Sandbox Code Playgroud)
也不能是可变长度数组.从C11(N1570)§6.6/ p6 常数表达式(强调我的前进):
一个整数常量表达式117)应具有整数型和应仅具有是积分常数,枚举常数,字符常数,操作数
sizeof的表达式,其结果是积分常数,_Alignof表达式和浮点常量是铸件的立即操作数.
为了完整起见,sizeof操作员并不总是导致持续表达,尽管这只会影响C89后的标准(在C11中,VLA是可选的).参照§6.5.3.4/ P2 的sizeof和_Alignof运营商:
如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量.