在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)
查找数组大小有效吗? 或者,如果其他方式有效,请建议我。
答案 0 :(得分:4)
它非常有效,因为它是一个导致编译时常量的构造(C99 VLA除外,见下文)。您可能想要使用:
sizeof(array)/sizeof(array[0])
相反,所以你可以将它与其他int类型一起使用。也许将它包装在一个宏中(当然,使用宏时所有关于谨慎的常见警告都适用)。
关于更新:对于我上面的原始答案,我没有考虑C99中的VLA,其中:
如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。 (6.5.3.4/2)
VLA数组元素的计数可能只能在运行时确定(并且评估本身可能有副作用),因此对于VLA,它不是纯粹的编译时构造。在大多数格式良好的情况下,VLA的代码级行为实际上是相同的。例如:
#include <stdio.h>
#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实际上有所不同的情况并不困难
因为在考虑更多之后,我不确定这是否属实。在separate question中询问此事。
无论如何,它仍然非常高效,因为首先要创建VLA,编译器必须弄清楚VLA将占用多少空间。因此,即使不是VLA的编译时常量,它仍然是确定数组大小的最有效方法。
答案 1 :(得分:0)
sizeof
是一个编译时构造,意味着它的值是在编译期间确定的,因此它在运行时是免费的。唯一的成本&#34;在运行时使用sizeof
将加载一个常量值,就像你已经硬编码一样。
换句话说,你拥有的代码是有效的。
答案 2 :(得分:0)
sizeof
基于静态类型信息(在编译时)进行评估。
一个例外是C99的variable-length arrays (VLAs).
C(自C99起)提供可变长度阵列(VLA)和柔性阵列成员(FAM)。对于可变长度数组,sizeof会评估其参数,因此存在(最小)运行时成本 - 大致相当于C ++中的std::vector::size()
。
对于包含灵活数组成员的所有其他类型(包括structs
),sizeof不评估其操作数,因此没有运行时成本(与C ++中相同)。
对于具有灵活数组成员的
struct
:“。的大小 结构应等于最后一个元素的偏移量 否则相同的结构取代了柔性阵列构件 有一个未指定长度的数组。“(C99,§6.7.2.1/ 16)。
因此,使用等于该值的正常整数不会导致性能变化。