A declaration of an object may provide its initial value through the process known as initialization.
For each declarator, the initializer, if not omitted, may be one of the following:
= expression | (1) | |
= { initializer-list } | (2) |
where initializer-list is a non-empty comma-separated list of initializers (with an optional trailing comma), where each initializer has one of three possible forms:
expression | (1) | |
{ initializer-list } | (2) | |
designator-list = initializer | (3) |
where designator-list is a list of either array designators of the form [
constant-expression ]
or struct/union member designators of the form .
identifier; see array initialization and struct initialization.
Note: besides initializers, brace-enclosed initializer-list may appear in compound literals, which are expressions of the form:
| (since C99) |
The initializer specifies the initial value stored in an object.
If an initializer is provided, see.
If an initializer is not provided:
When initializing an object of static or thread-local storage duration, every expression in the initializer must be a constant expression or string literal.
Initializers cannot be used in declarations of objects of incomplete type, VLAs, and block-scope objects with linkage.
The initial values of function parameters are established as if by assignment from the arguments of a function call, rather than by initialization (until the post-C11 defect report DR 427, which changes the wording to use initialization).
If an indeterminate value is used as an argument to any standard library call, the behavior is undefined. Otherwise, the result of any expression involving indeterminate values is an indeterminate value (e.g. int n; may not compare equal to itself and it may appear to change its value on subsequent reads).
#include <stdlib.h> int a[2]; // initializes a to {0, 0} int main(void) { int i; // initializes i to an indeterminate value static int j; // initializes j to 0 int k = 1; // initializes k to 1 // initializes int x[3] to 1,3,5 // initializes int* p to &x[0] int x[] = { 1, 3, 5 }, *p = x; // initializes w (an array of two structs) to // { { {1,0,0}, 0}, { {2,0,0}, 0} } struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2}; // function call expression can be used for a local variable char* ptr = malloc(10); free(ptr); // Error: objects with static storage duration require constant initializers // static char* ptr = malloc(10); // Error: VLA cannot be initialized // int vla[n] = {0}; }
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/c/language/initialization