需要建议以有效的方式确定C中的数组大小

在java中,java脚本和其他语言有array.length函数可用于了解循环和其他需要的数组长度。 在C编程我正在使用

sizeof() 

运算符,用于通过以下过程确定数组大小或数组长度:

  int array [] ={12, 3, 4, 6}; for (int i = 0; i < (sizeof(array)/sizeof(int)); i++) { // do sometings } 

我想知道的是

  sizeof(array)/sizeof(int) 

查找数组大小有效吗? 或者,如果其他方式有效,请建议我。

它非常有效,因为它是一个导致编译时常量的构造(C99 VLA除外,见下文)。 您可能想要使用:

 sizeof(array)/sizeof(array[0]) 

相反,所以你可以使用other-than-int类型。 也许将它包装在一个宏中(当然,使用宏时所有关于谨慎的常见警告都适用)。

更新时:对于我上面的原始答案,我没有考虑C99中的VLA,其中:

如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量。 (6.5.3.4/2)

VLA数组元素的计数可能只能在运行时确定(并且评估本身可能有副作用),因此对于VLA,它不是纯粹的编译时构造。 在大多数格式良好的情况下,VLA的代码级行为实际上是相同的。 例如:

 #include  #define countof_array(arr) (sizeof(arr)/sizeof(arr[0])) int vlaSize(void) { return 8; } int main(void) { int fixed_array[9] = { 1,2,3,4,5,6,7,8,9 }; int vla_array[vlaSize()]; printf("Fixed array: size = %zu bytes, count = %zu elements\n", sizeof(fixed_array), countof_array(fixed_array)); printf("VLA array: size = %zu bytes, count = %zu elements\n", sizeof(vla_array), countof_array(vla_array)); return 0; } 

结果:

 $ gcc -Wall -std=c99 so-misc.c $ ./a.out Fixed array: size = 36 bytes, count = 9 elements VLA array: size = 32 bytes, count = 8 elements 

进一步编辑,打击这部分:

警告:故意创建一个案例,其中countof_array的语义对于VLA countof_array会有所不同[…]

因为在考虑了更多之后,我不确定这是否属实。 在一个单独的问题中询问这一点。

在任何情况下,它仍然非常高效,因为首先创建VLA,编译器必须弄清楚VLA将占用多少空间。 因此,即使不是VLA的编译时常量,它仍然是确定数组大小的最有效方法。

sizeof是一个编译时构造,意味着它的值是在编译期间确定的,因此它在运行时是免费的。 运行时使用sizeof的唯一“成本”是加载一个常量值,就像你对它进行了硬编码一样。

换句话说,您拥有的代码是有效的。

sizeof基于静态类型信息(在编译时)进行评估。

一个例外是C99的可变长度数组(VLA)。

C(自C99起)提供可变长度arrays(VLA)和柔性arrays成员(FAM)。 对于可变长度数组,sizeof会评估其参数,因此存在(最小)运行时成本 – 大致相当于C ++中的std::vector::size() 。 对于所有其他类型(包括包含灵活数组成员的structs ),sizeof不评估其操作数,因此没有运行时成本(与C ++中相同)。

对于具有灵活数组成员的结构:“结构的大小应等于其他相同结构的最后一个元素的偏移量,该结构用一个未指定长度的数组替换灵活数组成员。” (C99,§6.7.2.1/ 16)。

因此,使用等于该值的正常整数不会导致性能变化。