В C у меня есть массив структур, определенных как:
struct D
{
char *a;
char *b;
char *c;
};
static struct D a[] = {
{
"1a",
"1b",
"1c"
},
{
"2a",
"2b",
"2c"
}
};
Я хотел бы определить число элементов в массиве, но sizeof(a)
возвраты неправильный результат: 48, не 2. Я делаю что-то не так или sizeof
просто ненадежный здесь? Если имеет значение, что я компилирую с GCC 4.4.
sizeof a / sizeof a[0];
Это константа времени компиляции, поэтому вы можете использовать ее, например, для создания другого массива:
#define N sizeof a / sizeof a[0]
int n_a[N];
sizeof
возвращает размер в памяти переданного элемента. Разделив размер массива на размер одного элемента, вы получите количество элементов.
Обратите внимание, что размер элемента также может включать некоторые байты заполнения. По этой причине структура с заполнением (например, когда за членом char следует указатель) будет иметь значение sizeof
больше, чем сумма размеров членов.
С другой стороны, не позволяйте этому беспокоить вас при подсчете элементов в массиве: sizeof (a) / sizeof (a [0])
по-прежнему будет работать так гладко, как ожидалось.
sizeof
дает вы размер в байтах, а не количество элементов. Как говорит Алок, чтобы получить количество элементов, разделите размер массива в байтах на размер одного элемента в байтах. Правильная идиома C:
sizeof a / sizeof a[0]