Here are step-by-step ANSI C citations to confirm the explicit NULL assignments aren’t required.


3.1.2,1 Scopes of Identifiers
“If the declarator or type specifier that declares the identifier appears outside of any block or list of parameters, the identifier has file scope, which terminates at the end of the translation unit. If the declarator or type specifier that declares the identifier appears inside a block or within the list of parameter declarations in a function definition, the identifier has block scope, which terminates at the } that closes the associated block.”


These struct declarations aren't within a block, so they have file scope.


3.1.2.2 Linkages of Identifiers
“If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.”


These file-scoped struct definitions have external linkage.


3.1.2.4 Storage Durations of Objects
“An object whose identifier is declared with external or internal linkage, or with the storage class specifier static has static storage duration.”


These file-scoped, externally-linked struct definitions have static storage duration.


3.5.7 Initialization -> Semantics
“If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every member that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant.”


These file-scoped, externally-linked struct definitions with non-explicit static storage duration are initialized with NULL.