Гарантируется ли инициализация членов структуры c значением 0? - PullRequest
3 голосов
/ 01 октября 2009

Когда я объявляю структуру в C, я гарантирую, что члены будут инициализированы к какому-то определенному значению, например 0 для целочисленных членов?

EDIT:

Итак, допустим, у меня есть структура, которая выглядит следующим образом:

typedef struct
{
     int a;
} my_str;

и я заявляю:

my_str thing1;

в глобальном масштабе. Согласно некоторым ответам, thing1.a будет инициализирован в 0 - правильно ли я понимаю?

Ответы [ 6 ]

7 голосов
/ 01 октября 2009

Соответствующие части стандарта C99:

раздел 6.2.4, §3:

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

раздел 6.2.4, §4:

Объект, идентификатор которого объявлен без связи и без статический спецификатор класса хранения длительность автоматического хранения.

п. 6.2.4, п. 5 (в отношении объектов с автоматическим хранением):

Начальная стоимость объекта неопределенный. Если инициализация указано для объекта, это выполняется каждый раз, когда декларация достигнуто в исполнении блока; в противном случае значение становится неопределенный каждый раз, когда декларация достигнута.

раздел 6.7.8, §10:

Если объект, который имеет автоматический срок хранения не инициализирован явно его значение неопределенный. Если объект, который имеет статическая продолжительность хранения не инициализируется явно, затем:

- если это имеет тип указателя, он инициализируется нулевой указатель;

- если есть арифметика тип, он инициализирован до (положительный или без знака) ноль;

- если это агрегат, каждый член инициализируется (рекурсивно) в соответствии с этими правила;

- если это союз, первый именованный член инициализирован (рекурсивно) в соответствии с этими правила.

7 голосов
/ 01 октября 2009

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

1 голос
/ 01 октября 2009

Из стандарта ANSI C : если объект со статической продолжительностью хранения не инициализируется явно, он инициализируется неявно, как если бы каждый член имел арифметический тип был назначен 0 и каждый член, который имеет тип указателя были назначены константы нулевого указателя. Если объект, который имеет продолжительность автоматического хранения не инициализируется явно, ее значение неопределенный

0 голосов
/ 01 октября 2009

В C ++ структура может иметь конструктор со списком инициализаторов для автоматической инициализации.

Структура - это тип данных, а тип не определяет инициализацию. Класс хранения определяет инициализацию. Так будет статически размещенный объект типа struct. как и любой другой статический объект, инициализируется нулем. Любой объект, объявленный с ключевым словом static или объявленный вне области действия функции, статически выделяется.

0 голосов
/ 01 октября 2009

Нет. Там нет такой гарантии. Если вы хотите, чтобы они были инициализированы нулем, это в значительной степени необходимо сделать вручную, если только структурная переменная не объявлена ​​как глобальная.

РЕДАКТИРОВАТЬ: Да, я забыл упомянуть статические переменные внутри функции.

0 голосов
/ 01 октября 2009

номер

Например, компилятор MS VC ++ будет инициализировать элементы struct равными нулю для отладочных сборок, и не будет инициализировать члены равными нулю для сборок выпуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...