Объекты никогда не инициализируются частично в C - если вы использовали инициализатор, тогда весь объект гарантированно инициализируется (в этом случае «объект» - это целый массив из 20 массивов по 30 символов в каждом). Все члены, которые не были явно инициализированы, рекурсивно инициализируются в ноль (для арифметических типов) или NULL (для типов указателей).
Таким образом, ответ, в этом случае, да - все char
s, явно не заданные значения инициализатором, гарантированно будут равны 0.
Это описано в стандарте C99 в разделе 6.7.8, Инициализация. Соответствующие пункты:
21 Если в инициализаторе меньше
список в скобках, чем есть
элементы или члены совокупности,
или меньше символов в строке
литерал, используемый для инициализации массива
известный размер, чем есть элементы в
массив, остаток от
агрегат должен быть инициализирован
неявно так же, как объекты, которые
имеют статическую продолжительность хранения.
и
10 Если объект, который имеет автоматический
срок хранения не инициализирован
явно его значение
неопределенный. Если объект, который имеет
статическая продолжительность хранения не
инициализируется явно, затем:
- если это
имеет тип указателя, он инициализируется
нулевой указатель;
- если есть арифметика
тип, он инициализирован до (положительный
или без знака) ноль;
- если это
агрегат, каждый член инициализируется
(рекурсивно) в соответствии с этими
правила;
- если это союз, первый
именованный член инициализирован
(рекурсивно) в соответствии с этими
правила.