Гарантировано ли, что memset будет обнулять биты заполнения в структуре?
В общем, согласно стандарту C гарантируется, что memset() с 0 будет обнулять биты заполнения в структуре C?
Как насчет gcc?
Например, что-то вроде:
struct MyStruct
{
unsigned char member1;
unsigned int member2;
char member3;
unsigned char member4;
float member5;
};
struct MyStruct ms;
memset(&ms, 0, sizeof( struct MyStruct));
Ответы
Ответ 1
Возможно, стоит отметить, что memset
ничего не знает о вашей структуре (или массиве, или примитиве, или о каком-либо фрагменте памяти, который вам удастся развязать), поэтому, даже если он хочет оставить биты дополнения неповрежденный, он даже не знал бы, где они находятся.
Ответ 2
Да, memset
записывает 32-битное значение в смежную область памяти заданной длины, начиная с заданного адреса. В вашем случае memset записывает область с (32-битное значение) 0
.
Итак, если вы делаете memset
длины sizeof (your_struct)
, вы должны быть в порядке:
memset(&ms, 0, sizeof(struct MyStruct));
Ответ 3
Если это имеет значение, вы, скорее всего, делаете что-то небезопасное и не переносное.
Да, вызов memset
будет устанавливать любые биты заполнения (или байты) на 0, но нет гарантии на языке, который устанавливает объект float
на все биты-ноль, устанавливает его в 0.0. То же самое относится к указателям: all-bits-zero не гарантированно является нулевым указателем. (В обоих случаях это справедливо для большинства реализаций.)
Исходный стандарт ISO C90 или C99 даже не гарантировал, что все биты-ноль являются допустимым представлением 0 для целых типов; одна из Технических исправлений после С99 добавила такую гарантию (только для целочисленных типов).
Для переносимости, если вы хотите, чтобы что-то было равным нулю, установите его явно. Вы также можете воспользоваться инициализацией нулевого значения для статических объектов и для пропущенных элементов в инициализаторах.
Терминологическая nitpick: "биты заполнения" являются частью представления целочисленных типов (и обычно их нет). Заполнение между элементами структуры - это байты заполнения.