Natürlich gibt es keine Argumente, dass es in den C-Normen ist. Erwarten Sie also, dass sich ein kompatibler Compiler so verhält.
Der technische Grund, warum es getan wurde könnte in wie der C-Startcode arbeiten verwurzelt sein. Es gibt normalerweise mehrere Speichersegmente, in die der Linker die Compilerausgabe einfügen muss, einschließlich eines Code- (Text-) Segments, eines Blockspeichersegments und eines initialisierten Variablensegments.
Nicht statische Funktionsvariablen verfügen nicht über physischen Speicher, bis der Bereich der Funktion zur Laufzeit erstellt wird, so dass der Linker nichts damit zu tun hat.
Programmcode geht natürlich in den Code (oder Text) Segment aber auch die Werte verwendet, um globale und statische Variablen zu initialisieren. Initialisierte Variablen selbst (d. H. Ihre Adressen) gehen in das initialisierte Speichersegment. Nicht initialisierte globale und statische Variablen werden in das Blockspeichersegment (bss) verschoben.
Wenn das Programm zur Ausführungszeit geladen wird, erstellt ein kleines Stück Code die C-Laufzeitumgebung. In ROM-basierten Systemen wird der Wert der initialisierten Variablen aus dem Code- (Text-) Segment in ihre jeweilige tatsächliche Adresse im RAM kopiert. Auf RAM (d.h. Platten) basierende Systeme können die Anfangswerte direkt in die endgültigen RAM-Adressen laden.
Die CRT (C Laufzeit) Nullen auch die BSS, die alle globalen und statischen Variablen enthält, die keine Initialisierer haben. Dies wurde wahrscheinlich als Vorsichtsmaßnahme gegen nicht initialisierte Daten durchgeführt. Es ist eine relativ einfache Blockfülloperation, da alle globalen und statischen Variablen zu einem Adresssegment zusammengepfercht wurden.
Natürlich schwimmt und verdoppelt kann besondere Behandlung erfordern, da ihr Wert 0.0 nicht alle Null-Bits, wenn das Floating-Format IEEE nicht 754.
Hinweis sein, dass da autovariables bei Programmladezeit nicht existieren Sie kann nicht initialisiert werden durch den Laufzeit-Startcode.
Gewählt, um wieder zu öffnen, weil diese Frage auch fragt, ob einige Compiler statische Variablen nicht auf null setzen. Die Antwort ist ja! Einige domänenspezifische Compiler entsprechen nicht allen Standards. Zum Beispiel wird in TIGCC (ein C-Compiler für TI-89/92/V200-Rechner) eine globale Variable mit einer expliziten Initialisierung (z. B. 'static int high_score = 0; ') über die Programmdurchläufe hinweg erhalten (sofern sie nicht archiviert ist) im Flash-Speicher), bietet eine einfache aber schmierige Möglichkeit, Programmeinstellungen zu behalten. –