有没有办法反省数组的大小?

时间:2010-05-22 18:13:55

标签: c++ arrays introspection

在C ++中给出如下数组:

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e
};

有没有办法反省bogus1才能找出四个字符长?

4 个答案:

答案 0 :(得分:10)

不确定

#include <iostream>

int main()
{
  unsigned char bogus1[] = {
    0x2e, 0x2e, 0x2e, 0x2e
  };

  std::cout << sizeof(bogus1) << std::endl;

  return 0;
}

发出4。更一般地说,sizeof(thearray)/sizeof(thearray[0])是数组中的项目数。但是,这是一个编译时操作,只能在编译器知道关于“项目数”的情况下使用(例如,在接收数组作为参数的函数中)。为了更加通用,您可以使用std::vector而不是裸阵列。

答案 1 :(得分:4)

使用sizeof时要注意的一件事是确保不会意外地执行已经衰减为指针的数组的大小:

void bad(int a[10])
{
    cout << (sizeof(a) / sizeof(a[0])) << endl;
}

int main()
{
    int a[10];
    cout << (sizeof(a) / sizeof(a[0])) << endl;
    bad(a);
}

在我的64位机器上,输出:

10
2

bad内计算的大小不正确,因为a会衰减到指针。通常,不要相信sizeof作为函数参数传递的数组。

答案 2 :(得分:0)

int bogus1_size = sizeof(bogus1) / sizeof(unsigned char);

答案 3 :(得分:0)

这解决了指针衰减问题:

#include <cstddef>

template<typename T, std::size_t N>
std::size_t array_size(T(&)[N]) { return N; }

因为除非已知数组大小,否则它将无法编译。