В каких случаях происходит инициализация нулями и в каких нет?
Ответ Инициализация нулями (zero-initialization) применяется в трех случаях: 1) Переменные со статическим и потоковым временем хранения (static/thread storage duration), перед тем как для них производится любая другая инициализация. Сюда входят переменные, объявленные с помощью ключевых слов thread_local, static, а также глобальные переменные. thread_local int a int b struct S { void f() { static int c } static int d } int S::d 2) При инициализации значением (value-initialization), если тип не является классом (class или struct), и не является массивом. union U { int a float b } void f(int, U) f(int(), U()) 3) Элементы массива char, для которых нет инициализаторов: char a[5] = "123" // a[3] и a[4] будут использованы нулями. Более подробно можно прочитать на cppreference.