在C89中的数组声明中使用sizeof()

9 c arrays sizeof clang c89

我的印象是在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)

这里发生了什么?那不被认为是可变大小的数组声明吗?

Jen*_*ens 8

在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)

  • 不是我的downvote,但这不是问题的答案.这应该是一个评论. (3认同)

Grz*_*ski 5

这是因为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运营商:

如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量.