Если компилятор C накладывает структуру, чтобы выровнять поля с их собственным выравниванием, и эта структура затем инициализируется, это заполнение, инициализированное нулем?
Например, следующая структура:
typedef struct foo_t_ {
int a;
char b;
int c;
char d;
} foo_t;
Во многих системах эта (плохо спроектированная) структура будет иметь sizeof(foo_t)
из 16 с общим количеством байтов в 6 байтов, по 3 байта после каждого из символов.
Если мы инициализируем структуру, например:
foo_t foo = { .a = 1, .b = '2' };
тогда поля foo.a
будут установлены в 1, а foo.b
будет установлено на символ "2". Неопределенные поля (`foo.c 'и' foo.d ') будут автоматически установлены на 0. Вопрос в том, что происходит с 6 байтами заполнения? Будет ли это также автоматически установлено на 0? или это поведение undefined?
Вариант использования заключается в том, что я буду вычислять хэши структур данных:
foo_t foo = { .a = 1, .b = '2' };
foo_t bar = { .a = 1, .b = '2' };
uint32_t hash_foo = calc_hash(&foo, sizeof(foo));
uint32_t hash_bar = calc_hash(&bar, sizeof(bar));
и я хочу быть уверенным, что hash_foo
и hash_bar
совпадают. Я мог бы гарантировать это, сначала используя memset()
, чтобы очистить структуры, а затем инициализировать их, но вместо этого кажется более чистым использовать инициализацию C.
На практике GCC в моей системе также очищает отступ, но я не знаю, гарантировано ли это.