инициализация структурного массива с помощью 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. Разве это не правильный способ инициализации структурного массива?
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
более уместно в первом варианте, так как 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
необходимости.
В вашем коде есть опечатка. Исправить:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
Выбирая хорошие имена, избегайте половины ошибок. Я бы рекомендовал "устройства".
Вы должны передать оператору
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));