Ответ 1
sizeof a / sizeof a[0];
Это константа времени компиляции, поэтому вы можете использовать ее, например, для создания другого массива:
#define N sizeof a / sizeof a[0]
int n_a[N];
В 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
дает размер в байтах, а не количество элементов. Как говорит Алок, чтобы получить количество элементов, разделите размер в байтах массива на размер в байтах одного элемента. Правильная C-идиома:
sizeof a / sizeof a[0]
sizeof
возвращает размер в памяти переданного элемента. Деля размер массива на один размер элемента, вы получаете количество элементов.
Обратите внимание, что размер элемента может также содержать некоторые байты заполнения. По этой причине дополненная структура (например, когда член char следует указателю) будет иметь значение sizeof
больше, чем сумма членов членов.
С другой стороны, не позволяйте этому беспокоить вас при подсчете элементов в массиве: sizeof(a) / sizeof(a[0])
будет работать как можно гладко.