Первый самый простой ( требует меньше ввода ), и он гарантированно работает, все члены будут установлены на 0
[Ref 1] .
Второй более читабельный.
Выбор зависит от предпочтений пользователя или от того, что предписано вашим стандартом кодирования.
[Ссылка 1] Ссылка C99 Стандарт 6.7.8.21:
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, оставшаяся часть агрегата должна быть инициализированы неявно так же, как объекты, которые имеют статическую продолжительность хранения.
Хорошее чтение:
C и C ++: частичная инициализация автоматической структуры
= {};
однако я не уверен, действительно ли это.foo = {0}
значит. Если бы я виделfoo = ZERO_FULL
, мне бы пришлось искать определение ZERO_FULL с помощью grep.Если данные являются статической или глобальной переменной, по умолчанию они заполняются нулями, поэтому просто объявите их.
myStruct _m;
Если данные являются локальной переменной или зоной, выделенной кучей, очистите их,
memset
например:Текущие компиляторы (например, последние версии
gcc
) достаточно хорошо оптимизируют это на практике. Это работает, только если все нулевые значения (включая нулевые указатели и ноль с плавающей запятой) представлены как все нулевые биты, что верно для всех платформ, о которых я знаю (но C стандарт разрешает реализации, где это ложно; я не знаю такой реализации) .Возможно, вы могли бы написать код
myStruct m = {};
илиmyStruct m = {0};
(даже если первый членmyStruct
не является скаляром).Я считаю, что использование
memset
локальных структур - лучший вариант, и он лучше передает тот факт, что во время выполнения что-то должно быть сделано (хотя обычно глобальные и статические данные можно понимать как инициализированные во время компиляции, без каких-либо затрат во время выполнения) .источник
0
будет эквивалентна инициализации всех членов структуры с помощью0
. На многих платформах это будет так, но не всегда.{}
недействительна для C, а доступна только в C ++.NULL
указатель не был полностью битовым0
: c-faq.com/null/machexamp.html . Кроме того, есть вероятность, что платформа не использует IEEE 754 для представления значений с плавающей запятой, а использует какое-то другое представление, которое не имеет полностью0
битового0.0
значения, но, по общему признанию, я не знаю такой платформы.См. §6.7.9 Инициализация:
Итак, да, они оба работают. Обратите внимание, что в C99 также может использоваться новый способ инициализации, называемый назначенной инициализацией:
источник