Указатели членов структуры автоматически инициализируются нулем?
Если у меня есть следующая структура:
struct MyStruct {
int *a;
int *b;
};
И инициализирует это так:
int some_var;
MyStruct s{
.a = &some_var
};
могу ли я быть уверен s.b
будет инициализирован в nullptr
?
РЕДАКТИРОВАТЬ:
Полный код компиляции, протестирован с g++ 7.3.0:
// test.cpp
struct MyStruct {
int *a;
int *b;
};
int main()
{
int some_var;
MyStruct s{
.a = &some_var
};
}
Если я напечатаю значения переменных в этом примере, b действительно равно 0. Но я хочу знать, гарантируется ли такое поведение стандартом.
1 ответ
Обратите внимание, что это синтаксис C99, который не поддерживается стандартом C++11, но поддерживается GCC. Документация GCC гласит, что пропущенные члены поля неявно инициализируются так же, как объекты, которые имеют статическую продолжительность хранения.
Альтернативный синтаксис будет
MyStruct s{
a: &some_var
};
Если одно и то же поле инициализируется несколько раз, оно будет инициализировано значением из последней инициализации. Если такая инициализация вызывает побочный эффект, не определено, происходит ли побочный эффект или нет. GCC отбрасывает их, происходит только последняя инициализация.
Вот C++11 совместимая инициализация:
MyStruct s { &some_var }; // second field would be initialized as one with static duration
GCC выдаст предупреждение об отсутствующих инициализаторах в обоих случаях.