Результат '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.

31
задан Peter Mortensen 28 February 2013 в 14:14
поделиться

3 ответа

sizeof a / sizeof a[0];

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

#define N sizeof a / sizeof a[0]
int n_a[N];
37
ответ дан 27 November 2019 в 21:36
поделиться

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

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

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

10
ответ дан 27 November 2019 в 21:36
поделиться

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

sizeof a / sizeof a[0]
45
ответ дан 27 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: