Гарантировано ли, что 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: "биты заполнения" являются частью представления целочисленных типов (и обычно их нет). Заполнение между элементами структуры - это байты заполнения.