инициализация массива структур с помощью memset

gcc 4.4.4 c89

У меня есть следующая структура.

struct device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
};

int main(void)
{
    struct device_sys dev_sys[NUM_DEVICES];

    memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));

    return 0; 
}

Я получаю дамп стека, когда я называю memset. Разве это не корректный способ инициализировать массив структур?

17
задан S.L. Barth - Reinstate Monica 17 October 2015 в 08:04
поделиться

4 ответа

Либо

memset(&dev_sys, 0, sizeof dev_sys);

, либо

memset(dev_sys, 0, NUM_DEVICES * sizeof(struct device_sys));

Или, если вы предпочитаете

memset(dev_sys, 0, NUM_DEVICES * sizeof *dev_sys);

, но не то, что вы есть в исходном варианте.

Обратите внимание, что в вашем конкретном случае во всех вариантах вы можете использовать либо & dev_sys , либо dev_sys в качестве первого аргумента. Эффект будет такой же. Однако & dev_sys более подходит в первом варианте, поскольку он следует за идиомой memset (ptr-to-object, object-size) . Во втором и третьем вариантах более целесообразно использовать dev_sys (или & dev_sys [0] ), поскольку он следует за memset (ptr-to-first-element, количество-элементов * размер-элемента) идиома.

P.S. Конечно, вместо того, чтобы использовать все эти хакерские уловки с memset , в вашем конкретном случае вам нужно было просто объявить свой массив с инициализатором

struct device_sys dev_sys[NUM_DEVICES] = { 0 };

Нет memset не требуется.

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

Вы должны передать оператору sizeof тип, а не переменную.

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

Я предпочитаю использовать typedef для структуры.

typedef struct tag_device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
} device_sys;

Вы можете использовать memset следующим образом:

    memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));
1
ответ дан 30 November 2019 в 10:49
поделиться

Для массива sizeof дает вам весь размер массива, а не размер отдельного элемента. Оператор sizeof - одно из немногих мест, где массив не рассматривается как указатель на его первый элемент.

1
ответ дан 30 November 2019 в 10:49
поделиться

В вашем коде есть опечатка. Исправление:

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

Выбор хороших имен позволяет избежать половины ошибок. Я бы порекомендовал "девайсы".

10
ответ дан 30 November 2019 в 10:49
поделиться
Другие вопросы по тегам:

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