Initialisierung
Eine Deklaration eines Objekts kann seinen Anfangswert durch den Prozess der Initialisierung bereitstellen.
Für jeden Deklarator kann der Initialisierer, wenn er nicht weggelassen wird, einer der folgenden sein
= Ausdruck |
(1) | ||||||||
= { initializer-list } |
(2) | ||||||||
= { }
|
(3) | (seit C23) | |||||||
wobei initializer-list eine nicht-leere, durch Kommas getrennte Liste von initializer s ist (mit einem optionalen abschließenden Komma), wobei jeder Initialisierer eine von drei möglichen Formen hat
| expression | (1) | ||||||||
{ initializer-list } |
(2) | ||||||||
{ }
|
(3) | (seit C23) | |||||||
designator-list = initializer |
(4) | (seit C99) | |||||||
|
wobei designator-list eine Liste entweder von Array-Designatoren der Form Hinweis: Neben Initialisierern kann eine in geschweifte Klammern eingeschlossene initializer-list in zusammengesetzten Literalen erscheinen, die Ausdrücke der Form sind
|
(seit C99) | ||||||||||||||||||||||||||||||||||||
Inhalt |
[bearbeiten] Erklärung
Der Initialisierer gibt den Anfangswert an, der in einem Objekt gespeichert wird.
[bearbeiten] Explizite Initialisierung
Wenn ein Initialisierer bereitgestellt wird, siehe
- Skalare Initialisierung für die Initialisierung von Skalartypen
- Array-Initialisierung für die Initialisierung von Arraytypen
- Struktur-Initialisierung für die Initialisierung von Struktur- und Union-Typen.
[bearbeiten] Implizite Initialisierung
Wenn kein Initialisierer bereitgestellt wird
- Objekte mit automatischer Speicherdauer werden mit unbestimmten Werten initialisiert (die Trap-Darstellungen sein können)
- Objekte mit statischer und Thread-lokaler Speicherdauer werden leer initialisiert
[bearbeiten] Leere Initialisierung
|
Ein Objekt wird leer initialisiert, wenn es explizit aus dem Initialisierer = {} initialisiert wird. |
(seit C23) |
In einigen Fällen wird ein Objekt leer initialisiert, wenn es nicht explizit initialisiert wird, das heißt
- Zeiger werden mit Nullzeigerwerten ihrer Typen initialisiert
- Objekte von ganzzahligen Typen werden mit vorzeichenlosem Null initialisiert
- Objekte von Gleitkommatypen werden mit positivem Null initialisiert
- alle Elemente von Arrays, alle Mitglieder von Strukturen und die ersten Mitglieder von Unions werden rekursiv leer initialisiert, zusätzlich werden alle Füllbits auf Null initialisiert
- (auf Plattformen, bei denen Nullzeigerwerte und Gleitkommanullen All-Bit-Null-Darstellungen haben, wird diese Art der Initialisierung für Statics normalerweise durch Allokation im .bss-Abschnitt des Programmabbilds implementiert)
[bearbeiten] Hinweise
Bei der Initialisierung eines Objekts mit statischer oder Thread-lokaler Speicherdauer muss jeder Ausdruck im Initialisierer ein konstanter Ausdruck oder ein String-Literal sein.
Initialisierer können nicht in Deklarationen von Objekten mit unvollständigem Typ, VLAs und Block-Scope-Objekten mit Linkage verwendet werden.
Die Anfangswerte von Funktionsparametern werden wie durch Zuweisung von den Argumenten eines Funktionsaufrufs hergestellt und nicht durch Initialisierung.
Wenn ein unbestimmter Wert als Argument für einen Aufruf einer Standardbibliotheksfunktion verwendet wird, ist das Verhalten undefiniert. Andernfalls ist das Ergebnis eines beliebigen Ausdrucks, der unbestimmte Werte beinhaltet, ein unbestimmter Wert (z. B. int n;, n ist möglicherweise nicht gleich sich selbst und es kann den Anschein haben, dass sich sein Wert bei nachfolgenden Lesevorgängen ändert)
|
Es gibt keine spezielle Konstruktion in C, die der Wertinitialisierung in C++ entspricht; jedoch kann = {0} (oder (T){0} in zusammengesetzten Literalen)(seit C99) stattdessen verwendet werden, da der C-Standard keine leeren Strukturen, leeren Unions oder Arrays der Länge Null erlaubt. |
(bis C23) |
|
Der leere Initialisierer = {} (oder (T){} in zusammengesetzten Literalen) kann verwendet werden, um die gleiche Semantik wie die Wertinitialisierung in C++ zu erreichen. |
(seit C23) |
[bearbeiten] Beispiel
#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}; }
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 6.7.9 Initialization (S: 100-105)
- C11-Standard (ISO/IEC 9899:2011)
- 6.7.9 Initialization (S: 139-144)
- C99-Standard (ISO/IEC 9899:1999)
- 6.7.8 Initialization (S: 125-130)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 6.5.7 Initialization
[bearbeiten] Siehe auch
| C++-Dokumentation für Initialisierung
|