Die Initialisierung statischer Variablen in C

Lesezeit: 3 Minuten

Ich habe eine Frage zur Initialisierung statischer Variablen in C. Ich weiß, wenn wir eine globale statische Variable deklarieren, die standardmäßig der Wert ist 0. Zum Beispiel:

static int a; //although we do not initialize it, the value of a is 0

aber was ist mit der folgenden Datenstruktur:

typedef struct
{
    int a;
    int b;
    int c;
} Hello;

static Hello hello[3];

sind alle Mitglieder in jeder Struktur von hello[0], hello[1], hello[2] initialisiert als 0?

Benutzeravatar von pmg
pmg

Ja, alle Mitglieder werden für Objekte mit statischem Speicher initialisiert. Siehe 6.7.8/10 im C99-Standard (PDF-Dokument)

Wenn ein Objekt mit automatischer Speicherdauer nicht explizit initialisiert wird, ist sein Wert unbestimmt. Wenn ein Objekt mit statischer Speicherdauer nicht explizit initialisiert wirddann:
— Wenn es einen Zeigertyp hat, wird es mit einem Nullzeiger initialisiert;
— wenn es vom arithmetischen Typ ist, wird es auf (positiv oder vorzeichenlos) Null initialisiert;
— wenn es sich um ein Aggregat handelt, wird jedes Mitglied (rekursiv) gemäß diesen Regeln initialisiert;
— Wenn es sich um eine Union handelt, wird das zuerst genannte Element (rekursiv) gemäß diesen Regeln initialisiert.

Um alles in einem Objekt zu initialisieren, sei es static oder nicht, bis 0 nutze ich das gerne universeller Nullinitialisierer

sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};

Es gibt kein partielle Initialisierung in C. Ein Objekt ist entweder vollständig initialisiert (to 0 der richtigen Art in Ermangelung eines anderen Werts) oder überhaupt nicht initialisiert.
Wenn Sie eine teilweise Initialisierung wünschen, können Sie zunächst nicht initialisieren.

int a[2]; // uninitialized
int b[2] = {42}; // b[0] == 42; b[1] == 0;
a[0] = -1; // reading a[1] invokes UB

  • Kannst du diese Zeile bitte etwas näher erläutern? a[0] = -1;

    – lfalkau

    20. Februar 2021 um 9:11 Uhr

  • Es ist eine einfache Aufgabe. Nach a wurde definiert (und nicht initialisiert gelassen), entweder lesend a[0] oder a[1] ruft UB auf. Nach der Zuweisung an a[0] Sie können von dort sicher lesen, aber nicht von a[1].

    – pmg

    20. Februar 2021 um 9:31 Uhr

Ja, solange sie eine statische oder Thread-Speicherdauer haben.

C11 (n1570), § 6.7.9 Initialisierung #10

Wenn ein Objekt mit statischer oder Thread-Speicherdauer nicht explizit initialisiert wird, dann:

[…]

  • wenn es einen arithmetischen Typ hat, wird es auf (positiv oder vorzeichenlos) Null initialisiert;
  • Wenn es sich um ein Aggregat handelt, wird jedes Mitglied (rekursiv) gemäß diesen Regeln initialisiert, und jede Auffüllung wird mit Null-Bits initialisiert.

[…]

  • Das Entwurf des C11-Standards (PDF-Dokument) ist online frei verfügbar.

    – pmg

    6. November 2012 um 12:48 Uhr

  • “Alle Objekte mit statischer Speicherdauer müssen vor dem Programmstart initialisiert (auf ihre Anfangswerte gesetzt) ​​werden.” (5.1.2.2.2 im c99 pdf) Was meine halbbezogene Frage anspricht. Wenn Sie eine statische Variable verwenden, weil Sie möchten, dass sie ihren Wert (wie für eine laufende Summe) über Funktionsaufrufe hinweg behält, sollten Sie sie manuell auf 0 initialisieren? Nein.

    – Alan Corey

    13. November 2018 um 17:11 Uhr

Benutzeravatar von Useless
Nicht zu gebrauchen

Ja, statische Variablen im Dateibereich werden auf Null initialisiert, einschließlich aller Mitglieder von Strukturen, Arrays usw.

Sehen Sie sich diese Frage als Referenz an (ich werde dafür stimmen, dies auch als Duplikat zu schließen).


Bearbeiten: Diese Frage wird viel besser beantwortet, also stimme ich für das Schließen das Frage als Duplikat von Diesstattdessen.

Als Referenz ist hier die C FAQ-Link aus der akzeptierten Antwort dieser Frage, obwohl die hier verlinkten C99- und C11-Standards natürlich kanonisch sind.

Ich möchte hinzufügen, dass statische Variablen (oder Arrays) in zwei Typen eingeteilt werden.

Initialisiert sind diejenigen, die zur Kompilierzeit vom Code einen Wert erhalten. Diese werden normalerweise in DS gespeichert, obwohl dies Compiler-spezifisch ist.

Der andere Typ ist nicht initialisiert Statik, die zur Laufzeit initialisiert und im BSS-Segment gespeichert wird, obwohl dies wiederum Compiler-spezifisch ist.

BSS

Für diejenigen, die den Standard nicht lesen möchten, wird er auch in erwähnt https://en.cppreference.com/w/c/language/initialization :

Implizite Initialisierung

Wenn kein Initialisierer bereitgestellt wird:

  • Objekte mit automatischer Speicherdauer werden auf unbestimmte Werte initialisiert (die Fallendarstellungen sein können)
  • Objekte mit statischer und Thread-lokaler Speicherdauer werden mit Null initialisiert

1403200cookie-checkDie Initialisierung statischer Variablen in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy