8.9 Initialisierung

Beim Definieren von Variablen kann man sie in C gleich initialisieren. Dies geht einfach, indem man nach der Definition mit = einen Wert angibt:

int
    i = 1;
double
    d1 = 25.8,
    d2;
vereinbart drei Variablen und gibt i den Anfangswert 1 und d1 den Anfangswert 25.8; d2 wird ebenfalls vereinbart, aber nicht initialisiert.

Strukturen und Felder initialisiert man, indem man für jede Struktur oder Teilstruktur die Werte in geschweiften Klammern ({...}) zusammenfaßt. Beginnt man eine Initialisierung, gibt aber nicht alle Werte an, dann werden die restlichen Elemente mit Nullen initialisiert (ein guter Compiler sollte hier aber eine Warnung ausgeben).

struct
{
    int     a;
    double  d;
}
v = { 25, 3.1415 };
vereinbart eine Variable v mit den Elementen a und d. v.a erhält den Anfangswert 25; v.d den Wert 3.1415.

int    feld[5] = { 1, 3, 5 };
vereinbart ein Feld mit den 5 Elementen feld[0] bis feld[4]. feld[0] erhält den Wert 1, feld[1] den Wert 3 und feld[2] den Wert 5. Für feld[3] und feld[4] ist kein Wert mehr angegeben; diese Elemente erhalten beide den Wert 0.

Gibt man alle Werte an, dann kann man dafür die Angabe der Feldlänge weglassen (muß aber nicht).

int feld[] = { 1, 3, 5, 0, 0 };
vereinbart ebenfalls ein Feld mit 5 Elementen; der Compiler kann die Feldlänge aus der Anzahl der Initialisierungen ablesen.

Für Felder vom Typ char[] gibt es eine abkürzende Schreibweise.

So kann man:

char cfeld[5] = { 'a', 'b', 'c', 'd', 'e' };

abkürzen durch18:

char cfeld[5] = { "abcde" };

Die fünf angegebenen Werte sind tatsächlich nur Anfangswerte und dürfen während des Programmlaufs geändert werden, etwa so:

    cfeld[3] = 'f';

Dies darf man nicht verwechseln mit der Initialisierung eines Zeigers:

char  *p = "abcde";
Damit vereinbart man einen Zeiger p, der anfangs auf die Stringkonstante ¨abcde¨ (6 Elemente inklusive Null) zeigt. Den Inhalt der Konstante, also die Zeichen, darf man nicht ändern (kann es aber trotzdem auf einigen Systemen). Ändern darf man dagegen den Inhalt des Zeigers selbst; dieser darf also irgendwann zur Laufzeit auch mal auf andere Zeichen an anderen Stellen im Speicher zeigen.

Felder oder Strukturen, die aus Feldern oder Strukturen bestehen, werden entsprechend ihrer Reihenfolge im Speicher mit geschachtelten geschweiften Klammern {...} initialisiert,

Bei der Initialisierung von automatischen Variablen (siehe Attributangaben) darf man auch einen Ausdruck angeben, der erst zur Laufzeit ausgewertet wird, also beispielsweise ein Rechenausdruck, der Funktionsparameter verwendet, oder ein Funktionsaufruf:

/* ingibini.c 31. 7.95 kw
 */

int gibi(void)
{
  return 5;
}

int main( int nargs, char **args )
{
  int n = nargs*2;
  int i = gibi();

  printf( "n=%d, i=%d\n", n, i );
}

Statische Variablen (also auch globale) darf man nur mit konstanten Ausdrücken initialisieren.

Initialisieren sollte man natürlich nur mit Werten, die auch vom Typ her mit den Variablen verträglich sind. Beispielsweise kann man int-Variablen mit ganzen Zahlen initialisieren und Zeiger auf Funktionen mit den Adressen von Funktionen; aber nicht umgekehrt.

Globale Variablen, also außerhalb von Funktionen definierte, werden automatisch mit Nullen initialisiert, sofern man nichts anderes angibt19.

AnyWare@Wachtler.de