2013-03-13 2 views
1

У меня есть такие, как-структуруC структура обивка инициализации

typedef struct 
{ 
    int a; // Let's say this ends up being 4 bytes 
    int b; // 4 bytes 
    char text[10]; // 10 bytes 
} blah_t; 

static blah_t myvar; 
  1. Предположим, сумма размеров полей составляет 18 байт blah_t, но sizeof(blah_t) 20 из-за заполнения.
  2. myvar статический, поэтому он будет инициализирован нолем.

Вопрос:

  1. ли набивка байтов 19 и 20 гарантированно 0 для статической переменной? Если нет, мне нужно будет сделать memset(&myvar, 0, sizeof(blah_t)) для любого memcmp структуры, которая будет действительной - даже для статической переменной.
  2. Что относительно calloc(1, sizeof(blah_t))? Являются ли байты 19 и 20 равными нулю? Я считаю, что это так.

ответ

4

От стандарта ISO C99: «Когда значение сохраняется в объекте структуры или типа объединения, в том числе в объекте члена, байты представления объектов, которые соответствуют любым заполняющих байтов принимать неопределенное значение.»

Глядя дальше, это, кажется, обсудить некоторые дополнительные вопросы: Comparing structures in C vs C++

EDIT: не дубликат этого вопроса само по себе, но много общих вопросов с подробными ответами.

+0

Приятно процитировать стандарт; можете ли вы дать «главу и стих» (какой раздел, какой пункт)? В С2011 (ИСО/МЭК 9899: 2011) в §6.2.6. Представления типов и подраздела §6.2.6.1 Общие положения, пункт 6. –

+0

Хороший момент, я имел в виду и оставил его. 6.2.6.1 Представления типов, пункт 6. –

+0

Я не вижу дублирования с вопросом, который вы упомянули на C++. Классы C++ - это другое животное. Что я надеюсь узнать ... если где-то в спецификации он описывает, как статические переменные инициализируются для этого конкретного случая. –

0

Пропущенные байты 19 и 20. Гарантируются ли они 0 для статической переменной ?

См. Ответ Рэнди Говарда.

Как насчет calloc (1, sizeof (blah_t))? Байт 19/20 гарантированно равен ?

Да. calloc нули памяти.

Из любопытства, мне интересно, почему это вас беспокоит прокладка. Портативный код не должен беспокоиться ни о каком аспекте представления (отступы, сущность и т. Д.).

+0

Я хочу memcmp статическую структуру по сравнению с структурой, которая была выделена через calloc. Я знаю, что поведение дополнения не определено, когда дело доходит до хранилища, но статически выделенная структура может считаться или не считаться «хранилищем» в спецификации. Очень техничное различие, которое я ищу, да. –

+0

не имеет значения для переносимости, но может иметь значение для обеспечения безопасности. Информация может быть просочилась из стека для автоматически распределенных переменных, заполнение которых не было инициализировано. –