Werden globale Variablen in C immer auf Null initialisiert? [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
Alex

#include <stdio.h>
int a[100];
int main(){
    printf("%d",a[5]);
    return 0;
}

Gibt der obige Code immer ‘0’ aus oder ist er Compiler-spezifisch? Ich verwende den gcc-Compiler und habe die Ausgabe als ‘0’ erhalten.

Benutzer-Avatar
Simonc

Ja, alle Mitglieder von a werden garantiert auf 0 initialisiert.

Aus Abschnitt 3.5.7 des C89-Standards

Wenn ein Objekt mit statischer Speicherdauer nicht explizit initialisiert wird, wird es implizit so initialisiert, als ob jedem Mitglied mit arithmetischem Typ 0 und jedem Mitglied mit Zeigertyp eine Nullzeigerkonstante zugewiesen worden wäre.

  • Ich glaube, das ist aus dem “X3” ANSI C-Entwurf? Derselbe Text gilt immer noch im C-Standard, aber warum eine so alte, veraltete Quelle zitieren?

    – Ludin

    15. April 2013 um 13:24 Uhr

  • @Lundin Es war die einzige Quelle, die ich zur Hand hatte, und ich dachte, es wäre immer noch eine bessere Antwort als “Ja, der (nicht referenzierte) Standard sagt es”. Ich habe Ihrem Hinweis auf einen moderneren Standard +1 gegeben.

    – Simonc

    15. April 2013 um 13:25 Uhr

  • Aha, na die C11-Entwurf ist im Netz leicht zu finden. Die Unterschiede zwischen dem Entwurf und dem endgültigen C11-Standard sind kosmetischer Natur, abgesehen von einer geringfügigen Berichtigung.

    – Ludin

    15. April 2013 um 13:28 Uhr


  • Eine Änderung zwischen dem 1989 C-Standard und dem aktuellen Standard besteht darin, dass ein nicht initialisiertes Objekt mit automatischer Speicherdauer funktioniert nicht unbestimmten Wert haben. Im Allgemeinen ist das Verhalten, das sich aus der Verwendung eines solchen Objekts ergibt, nicht durch die Norm definiert.

    – Eric Postpischil

    15. April 2013 um 13:43 Uhr

  • Die beste Referenz wäre die älteste verfügbar, weil es die Geschichte zeigen würde, wie lange die Regel in Kraft ist. Wenn Sie einen Verweis auf den C18-Standard geben, könnte ich (fälschlicherweise) davon ausgehen, dass dies ein neuer Teil des Standards ist. Zu wissen, dass C-Code, der 1975 geschrieben wurde, seine globalen nicht initialisierten Variablen auf Null setzen wird, ist wichtig. Über einen Hinweis würde ich mich freuen älteste Norm die diese Regel aufstellt.

    – Christoph Schultz

    18. Januar 2019 um 17:00 Uhr

“Globale Variablen” werden unter definiert Dateibereich, außerhalb jeder Funktion. Alle Variablen, die im Dateibereich definiert sind, und alle Variablen, die mit dem Schlüsselwort deklariert sind static etwas angerufen haben statische Speicherdauer. Das bedeutet, dass sie in einem separaten Teil des Speichers zugewiesen werden und während der gesamten Lebensdauer des Programms bestehen bleiben.

Es bedeutet auch, dass sie auf jedem C-Compiler garantiert auf Null initialisiert werden.

Aus dem aktuellen C-Standard C11 6.7.9/10:

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

— 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;”

Praktisch bedeutet dies, dass, wenn Sie Ihre globale Variable auf einen bestimmten Wert initialisieren, sie diesen Wert hat und in einem Speichersegment zugewiesen wird, das normalerweise als bezeichnet wird .data. Wenn Sie ihm keinen Wert zuweisen, wird er einem anderen Segment mit dem Namen zugewiesen .bss. Globals werden niemals auf dem Stapel zugewiesen.

Benutzer-Avatar
Sam

Ja. Jede globale Variable wird mit initialisiert Standardwert von diesem Typ.
0 ist der Standardwert und wird automatisch in einen beliebigen Typ umgewandelt. Wenn es ein Zeiger ist, 0 wird NULL

Globale Variablen bekommen dort Platz in der Datensegment was auf Null gesetzt wird.

es ist nicht Compiler-spezifisch, aber im C-Standard definiert.

Es wird also immer 0 ausgegeben.

  • XORing mit sich selbst ist ein Implementierungsdetail; es spielt keine Rolle wie das Zeug ist genullt.

    – glglgl

    15. April 2013 um 13:12 Uhr

  • Außerdem bezweifle ich sehr, dass eine moderne Implementierung XOR zum Leeren des Speichers verwendet, da dies zusätzliche Lesevorgänge nach sich ziehen würde, was völlig unnötig ist und die Startzeit der Anwendung verlängert. XOR mit sich selbst eignet sich gut zum Löschen von Registern auf bestimmten Prozessoren, die keine spezielle Anweisung zum “Setze Register auf Null” haben. Es ist nicht gut, Speicherbereiche auf Null zu setzen.

    – Mats Petersson

    15. April 2013 um 13:14 Uhr


Ohne explizite Initialisierer deklarierte Dateibereichsobjekte werden durch initialisiert 0 standardmäßig (und zu NULL für Zeiger).

Nicht statische Objekte im Blockbereich, die ohne explizite Initialisierer deklariert wurden, bleiben nicht initialisiert.

Wird die Globle-Variable in C immer auf Null initialisiert?

Ja und es ist im C-Standard definiert.

Benutzer-Avatar
Prasun Saurav

Es ist nicht Compiler-spezifisch. Der Code wird immer gedruckt 0.

1369760cookie-checkWerden globale Variablen in C immer auf Null initialisiert? [duplicate]

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

Privacy policy