" Нужно ли мне устанавливать ptr
на NULL
, если я использую memset()
раньше? "
Если вы хотите, чтобы ваша программа быть полностью совместимым со стандартом, тогда да, так как memset()
устанавливает каждый байт на 0
, что отличается от установки NULL
для указателя. (Предполагая, что ptr
эквивалентно p
внутри структуры sth
).
Цитата из текущего C стандарта ISO: IEC 9899: 2018 (C18), раздел 7.22.3.5/2 - Функция Callo c:
" Пробел инициализируется всеми нулевыми битами. 302) "
" 302 - Обратите внимание, что это не должно совпадать с представлением плавающей нулевая точка или константа нулевого указателя ."
" Поскольку я использовал memset()
, нужно ли мне писать A, B, C "?
A.
является избыточным, поскольку t
не является объектом типа с плавающей запятой, поскольку те могут иметь нулевое значение с плавающей запятой , который может иметь не все биты, установленные на 0
. Если бы t
было типа float
или double
A.
, было бы полезно и уместно соответствовать стандарту.
B.
и C.
являются подходящими, поскольку в соответствии со стандартной настройкой каждый байт 0
не обязательно также устанавливает указатели на NULL
, если вы явно хотите, чтобы они были назначены на NULL
(хотя так должно быть в большинстве систем).
Обратите внимание, что calloc()
может быть более удобным, а также более быстрым по производительности, поскольку он выделяет память и немедленно инициализирует каждый ее бит в 0
:
struct sth *data = calloc(sizeof(*data));
Но, опять же, здесь p
и next
не обязательно должны быть NULL
.