Reputation: 1389
It is common to use {0}
to initialize a struct
or an array
but consider the case when the first field isn't a scalar type. If the first field of struct Person
is another struct
or array, then this line will result in an error (error: missing braces around initializer
).
struct Person person = {0};
At least GCC allows me to use an empty initializer list to accomplish the same thing
struct Person person = {};
But is this valid C code?
Also: Is this line guaranteed to give the same behavior, i.e. a zero-initialized struct
?
struct Person person;
Upvotes: 57
Views: 27307
Reputation: 211
Yes from C23 empty initialization is allowed. If the initializer is the empty initializer, the initial value is the same as the initialization of a static storage duration object.
struct Person person = {}; // Valid C23
If an object is initialized with an empty initializer, then:
If it has pointer type, it is initialized to a null pointer
If it has decimal floating type, it is initialized to (positive or unsigned) zero, and the quantum exponent is implementation-defined166)
If it has arithmetic type, and it does not have decimal floating type, it is initialized to (positive or unsigned) zero
If it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits
If it is a union, the first-named member is initialized (recursively) according to these rules, and any padding is initialized to zero bit
Reference: ISO/IEC 9899:202x (E)
Upvotes: 21
Reputation: 51
It depends. For ISO C standard, before ISO C23, the empty initialization of arrays, structs, or unions is not allowed; since ISO C23 (see 6.7.10 Initialization), it is allowed:
braced-initializer:
{ }
{ initializer-list }
{ initializer-list , }
An empty brace pair ({}) is called an empty initializer and is referred to as empty initialization
However, GCC provides GNU C extensions that allow empty initialization of arrays or structs. Unless -Wpedantic
, -pedantic
, or -pedantic-errors
options are given, GCC will not throw warnings or errors for this.
Upvotes: 1
Reputation: 11366
According to the C99 standard, array creation with an empty initializer list is forbidden. In a previous answer, you can see that grammar does not describe this case.
But what happens if you declare an array without initialization? Well, it depends on the compiler which you use. Let's take a look at this simple example: int arr[5] = {}
.
GCC
By default gcc
does not produce any warnings/errors when you try to compile this code. Not even -Wall
, but -Wpedantic
does.
warning: ISO C forbids empty initializer braces
But anyway gcc
fill members of an array with 0's exactly as if you specify it explicitly int arr[5] = {0}
see assembly output godbolt.
CLANG
But default not showing warnings about this case, but with option -Wgnu-empty-initializer
does:
warning: use of GNU empty initializer extension
Clang generates different assembly code godbolt but behaves the same.
Upvotes: 9
Reputation: 110146
No, an empty initializer list is not allowed. This can also be shown by GCC when compiling with -std=c99 -pedantic
:
a.c:4: warning: ISO C forbids empty initializer braces
The reason is the way the grammar is defined in §6.7.9 of the 2011 ISO C Standard:
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer
According to that definition, an initializer-list must contain at least one initializer.
Upvotes: 68