Нет, разницы нет.
Для одного, '\0'
не является «одним байтом»; в Си символьные константы имеют тип int
, поэтому '\0'
и 0
эквивалентны на 100% в каждом контексте. (Вы можете проверить это с помощью sizeof
: и sizeof 0
, и sizeof '\0'
приведут к одному и тому же значению, обычно 4 или 8.)
Другая причина объясняется в правилах инициализации C (в C99 это 6.7.8 Инициализация ):
[...]
В противном случае инициализатор для объекта, который имеет агрегатный или объединенный тип, должен быть заключенным в скобки списком инициализаторов для элементов или именованных членов.
Каждый заключенный в скобки список инициализаторов имеет связанный текущий объект . Когда нет
обозначения присутствуют, подобъекты текущего объекта инициализируются в порядке
типу текущего объекта: элементы массива в порядке возрастания индекса, структура
члены в порядке объявления, и первый названный член союза. [...]
Это говорит о том, что члены списка инициализации используются для инициализации полей структуры или массива по порядку; не имеет значения, сколько у них байтов.
Если вы напишите
struct foo { double x; };
struct foo var = { 0 };
затем 0
(первое значение инициализатора, тип int
) используется для инициализации первого поля структуры (x
, тип double
). Это как если бы вы написали double x = 0
. В результате значение 0
неявно преобразуется из int
в double
и сохраняется в переменной.
Кроме того, если инициализаторов меньше, чем элементов структуры или массива, это правило срабатывает:
- Если в заключенном в скобки списке меньше инициализаторов, чем элементов или элементов
или меньше символов в строковом литерале, используемом для инициализации массива известных
размер, чем есть элементы в массиве, остаток от совокупности должен быть
инициализируется неявно так же, как объекты со статической продолжительностью хранения.
Так как же неявная инициализация работает со статическими объектами?
Если объект, имеющий автоматическую продолжительность хранения, не инициализирован явно, его значение равно
неопределенный. Если объект со статической продолжительностью хранения не инициализирован явно,
то:
- если указатель имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется нулевым (положительным или без знака);
- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.
Это означает, что все неинициализированные в явном виде члены массива или структуры неявно установлены на 0.