Are the members of a global structure initialized to zero by default in C?

后端 未结 5 1779
星月不相逢
星月不相逢 2020-12-04 22:21

Are the members of a global or static structure in C guaranteed to be automatically initialized to zero, in the same way that uninitialized global or static variables are?

5条回答
  •  时光说笑
    2020-12-04 22:43

    From the C99 standard 6.7.8/10 "Initialization":

    If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:

    — if it has pointer type, it is initialized to a null pointer;
    — if it has arithmetic type, it is initialized to (positive or unsigned) zero;
    — if it is an aggregate, every member is initialized (recursively) according to these rules;
    — if it is a union, the first named member is initialized (recursively) according to these rules

    Since globals and static structures have static storage duration, the answer is yes - they are zero initialized (pointers in the structure will be set to the NULL pointer value, which is usually zero bits, but strictly speaking doesn't need to be).

    The C++ 2003 standard has a similar requirement (3.6.2 "Initialization of non-local objects"):

    Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place.

    Sometime after that zero-initialization takes place, constructors are called (if the object has a constructor) under the somewhat more complicated rules that govern the timing and ordering of those calls.

提交回复
热议问题