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

时间:2015-01-20 05:09:01

标签: c arrays

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

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

3 个答案:

答案 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)。

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