Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ structure initialization with all zeros

In C++ if I initialize the structure in the form of "= {}", as in example below, does it ensure to assign values zero to all the member of the structure? I understand this seem duplicate question, But my question also is if it initializes zero to all members, does it also apply for complex structure ? Like structure within structure , or for this each member has to be explicitly assigned value zero in the code?.


typedef struct s{
      int i;
      bool x;
 };

  int main ()
 {
     s initial = {};
     printf("%d %d", initial.i, initial.x);

 }

Edit: To reference complex structure,

typedef struct scomplex{
    s initial;
    s t[5];
 };
  int main (void)
  {
     scomplex sc = {};
     printf ("%d %d %d",sc.initial.i, sc.initial.x, sc.t[0].i);  
  }
like image 232
Just Avatar asked Oct 09 '16 01:10

Just


Video Answer


2 Answers

But my question also is if it initializes zero to all members, does it also apply for complex structure ?

Yes, all members will be initialized, including "complex" member, but might not be initialized to zero, the final effect is determined by their types.

According to your sample code, struct s is an aggregate type, then aggregate initialization is performed.

(emphasis mine)

If the number of initializer clauses is less than the number of members and bases (since C++17) or initializer list is completely empty, the remaining members and bases (since C++17) are initialized by their default initializers, if provided in the class definition, and otherwise (since C++14) by empty lists, in accordance with the usual list-initialization rules (which performs value-initialization for non-class types and non-aggregate classes with default constructors, and aggregate initialization for aggregates).

For this case the member i and x of struct s will be value initialized to zero.

4) otherwise, the object is zero-initialized.

If struct s has any other members, they'll be initialized (value initialized or aggregate initialized according to their types) by empty lists recursively.

EDIT

For your added sample (struct scomplex), the member initial will be value initialized, and the final effect depends on the type s. And another member is an array, which will be aggregate initialized with empty list, and all the elements of the array will be value initialized; Same as member initial, the effect depends on the type s.

like image 63
songyuanyao Avatar answered Sep 26 '22 06:09

songyuanyao


Problem

Will this initialize all of the members to 0?

typedef struct s{
      int i;
      bool x;
 };

int main ()
{
     s initial = {};
     printf("%d %d", initial.i, initial.x);

}

Answer: yes. Proof? Here you can see it become 0.

Better Alternatives?

This is an opinionated section. But In My Opinion (IMO), initializing it with {0} would be more readable than {}, as it notifies the user of the 0. It is actually being filled up with 0's.

s initial = {0};

What is this called?

This is called Aggregate Initialization, as Dieter Lücking defined, or Value Initialization, as songyuanyao noted. It's basically a form of initialization where you can initialize a struct with values you would like. For example, let's initialize it with the value 1 instead of 0! You would do:

// Example program
#include <stdio.h>
#include <iostream>


typedef struct s{
 int i;
 bool x;
};
    
int main ()
{
   s initial = {1,1};
   printf("%d %d", initial.i, initial.x);
}

You can see this compiled here. As you can see above, I am doing 1,1 which is normal initialization. As opposed to 0 initialization, you can't just initialize all the parts of the struct as easily as you can with 0.

References

cpprefrence

what is aggregate initialization

What do the following phrases mean in C++: zero-, default- and value-initialization?

Glossary

Aggregate Initialization :

Aggregate initialization is a form of list-initialization, which initializes aggregates.

Value Initialization:

Initialize values

This is the initialization performed when a variable is constructed with an empty initializer.

like image 23
amanuel2 Avatar answered Sep 26 '22 06:09

amanuel2