Namensräume
Varianten
Aktionen

Initialisierung

Von cppreference.com
< c‎ | Sprache

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 [ constant-expression ] oder von Struktur/Union-Member-Designatoren der Form . identifier  ist; siehe Array-Initialisierung und Struktur-Initialisierung.

Hinweis: Neben Initialisierern kann eine in geschweifte Klammern eingeschlossene initializer-list in zusammengesetzten Literalen erscheinen, die Ausdrücke der Form sind

( type ) { initializer-list }
( type ) { } (seit C23)
(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

[bearbeiten] Implizite Initialisierung

Wenn kein Initialisierer bereitgestellt wird

[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