Инициализация массива структуры с использованием 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. Это не правильный способ инициализации массива структуры?
Ответы
Ответ 1
Либо
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
более уместен в первом варианте, так как if следует memset(ptr-to-object, object-size)
идиоме. Во втором и третьем вариантах более целесообразно использовать dev_sys
(или &dev_sys[0]
), поскольку он следует за memset(ptr-to-first-element, number-of-elements * element-size)
идиомой.
P.S. Конечно, вместо использования всей этой хакерской трюки memset
в вашем конкретном случае вы должны просто объявить свой массив с инициализатором
struct device_sys dev_sys[NUM_DEVICES] = { 0 };
Нет memset
.
Ответ 2
В вашем коде есть опечатка. Fix:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
Выбор хороших имен исключает половину ошибок. Я бы рекомендовал "устройства".
Ответ 3
Вы должны передать оператору 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));
Ответ 4
Для массива sizeof
вы получаете весь размер массива, а не размер отдельного элемента. Оператор sizeof
является одним из немногих мест, где массив не рассматривается как указатель на его первый элемент.