Есть ли способ проанализировать размер массива? - PullRequest
2 голосов
/ 22 мая 2010

В C ++ указан массив, подобный следующему:

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

Есть ли способ проанализировать фальшивку1, чтобы узнать, что это четыре символа?

Ответы [ 4 ]

10 голосов
/ 22 мая 2010

Sure:

#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 вместо пустого массива.

4 голосов
/ 22 мая 2010

С 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 a, который был передан в качестве аргумента функции.

0 голосов
/ 23 мая 2010

Это решает проблему затухания указателя:

#include <cstddef>

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

В этом случае он не скомпилируется, если не известен размер массива.

0 голосов
/ 22 мая 2010
int bogus1_size = sizeof(bogus1) / sizeof(unsigned char);
...