2011-12-18 4 views
10

В общем, согласно стандарту C гарантируется, что memset() с 0 будет обнулять биты заполнения в структуре C?Гарантировано ли, что memset будет обнулять биты заполнения в структуре?

Что относительно 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)); 
+0

Можете ли вы показать нам образец кода? – Mysticial

+0

код добавленного кода –

+2

Я не понимаю, что заставляет вас сомневаться в этом. –

ответ

15

Возможно, стоит отметить, что memset ничего не знает о вашей структуры (или массив, или примитивный, или любой фрагмент что бы вы не развязали его), поэтому, даже если он захочет оставить биты дополнений неповрежденными, он даже не узнает, где они находятся.

11

Да, memset пишет 32-битовое значение в непрерывную область памяти заданной длины, начиная с заданного адреса. В вашем случае memset записывает область с (32-битным значением) 0.

Так что, если вы делаете memset длины sizeof (your_struct), вы должны быть хорошо:

memset(&ms, 0, sizeof(struct MyStruct)); 
8

Если это имеет значение, вы, вероятно, делаете что-то небезопасное и не переносное.

Да, вызов memset установит любые биты заполнения (или байты) на 0, но на языке, на котором установлен объект , нет никакой гарантии, что для всех бит-ноль будет установлено значение 0.0. То же самое относится к указателям: all-bits-zero не гарантированно является нулевым указателем. (В обоих случаях это справедливо для большинства реализаций.)

Исходный стандарт ISO C90 или C99 даже не гарантировал, что все бит-ноль является допустимым представлением 0 для целых типов; одна из технических исправлений после C99 добавила такую ​​гарантию (только для целочисленных типов).

Для переносимости, если вы хотите, чтобы что-то было равным нулю, установите его явно. Вы также можете воспользоваться инициализацией нулевого значения для статических объектов и для пропущенных элементов в инициализаторах.

Терминологическая нитьрика: «биты заполнения» являются частью представления целочисленных типов (и обычно их нет). Заполнение между элементами структуры - заполнение байтов.

Смежные вопросы