字节数组中的项数

时间:2010-01-16 10:55:54

标签: c++

我有以下C ++数组:

byte data[] = {0xc7, 0x05, 0x04, 0x11 ,0x45, 0x00, 0x00, 0x00, 0x00, 0x00};

我怎么知道这个数组中有多少项?

3 个答案:

答案 0 :(得分:9)

对于字节大小的元素,您可以使用sizeof(data)

更一般地说,sizeof(data)/sizeof(data[0])将给出元素的数量。


由于您的上一个问题出现了这个问题,我将澄清当您将数组作为参数传递给函数时不能使用它:

void f(byte arr[])
{
    //This always prints the size of a pointer, regardless of number of elements.
    cout << sizeof(arr);
}

void g()
{
    byte data[] = {0xc7, 0x05, 0x04, 0x11 ,0x45, 0x00, 0x00, 0x00, 0x00, 0x00};
    cout << sizeof(data);    //prints 10
}

答案 1 :(得分:5)

你应该真的使用Neil的建议:std::vector<byte>在大多数情况下是一个更好的解决方案(唯一更复杂的部分是初始化,在其他任何事情上更安全)。

如果没有,您可以使用带模板的类型安全方法,而不是使用sizeof(array)/sizeof(array[0])sizeof(array)(从sizeof(byte)==1开始):

template <typename T, unsigned int N>
unsigned int size_of_array( T (&)[N] ) {
   return N;
}

或者,如果你需要一个编译时常量(同时你要确保你不小心在非数组上调用它:

template <typename T, unsigned int N>
char (&static_size_of_array( T (&)[N] ))[N];

#define compile_time_size(x) (sizeof(static_size_of_array((x))))

在大多数情况下,您不需要最后的解决方案。传递指针(而不是数组)时,两个模板化解决方案都会快速失败:

void f( char array[] ) // misleading name:
{
   char array2[] = { 1, 2, 3 };
   size_of_array(array2);          // 3
   size_of_array(array);           // compile time error

   sizeof(array)/sizeof(array[0]); // 4/8, depending on architecture!!!
}

答案 2 :(得分:2)

sizeof( data);     // because sizeof(byte) is 1

但是,这不是一个好的通用解决方案 - 特别是如果将数组传递给函数:

void  f( byte a[] ) {
   // number of elements in 'a' unknown here 
}

数组衰减为指针,因此sizeof运算符将始终为您指定指针的大小,而不是数组中元素的数量。

相反,您应该使用std::vector<byte>,其成员函数为size()