Результат 'sizeof' в массиве структур в C?

В 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.

Ответ 1

sizeof a / sizeof a[0];

Это константа времени компиляции, поэтому вы можете использовать ее, например, для создания другого массива:

#define N sizeof a / sizeof a[0]
int n_a[N];

Ответ 2

sizeof дает размер в байтах, а не количество элементов. Как говорит Алок, чтобы получить количество элементов, разделите размер в байтах массива на размер в байтах одного элемента. Правильная C-идиома:

sizeof a / sizeof a[0]

Ответ 3

sizeof возвращает размер в памяти переданного элемента. Деля размер массива на один размер элемента, вы получаете количество элементов.

Обратите внимание, что размер элемента может также содержать некоторые байты заполнения. По этой причине дополненная структура (например, когда член char следует указателю) будет иметь значение sizeof больше, чем сумма членов членов.

С другой стороны, не позволяйте этому беспокоить вас при подсчете элементов в массиве: sizeof(a) / sizeof(a[0]) будет работать как можно гладко.