Was ist der Standardzustand der Variablen?
-
06-07-2019 - |
Frage
Wenn ein C-Programm startet und Variablen an Speicherstellen zugeordnet sind, wird der C-Standard sagen, wenn dieser Wert initialisiert wird?
// global variables
int a;
int b = 0;
static int c;
In dem obigen Code, ‚b‘ wird auf 0 initialisiert werden, was der Anfangswert von ‚a‘ ist? Ist ‚c‘ anders, da es zu diesem Modul statisch ist?
Lösung
Da Sie ausdrücklich erwähnt global Variablen. Im Falle von globalen Variablen, ob sie static
deklariert sind oder nicht, werden sie auf 0 initialisiert werden
Lokal Variablen auf der anderen Seite werden undefined (es sei denn, sie static
deklariert werden, wobei in diesem Fall auch sie auf 0 initialisiert werden - dank Tyler McHenry). Übersetzt bedeutet das, dass Sie nicht auf die sie enthalten, eine bestimmte Sache verlassen können -. Sie werden nur Müll, was zufällig enthalten an dieser Stelle war bereits im Speicher, die unterschiedlich sein können von Lauf Lauf
Andere Tipps
Edit:. Folgende gilt nur für lokale Variablen - nicht Globals
Der Anfangswert einer Variablen ist nicht definiert. In einigen Sprachen im Speicher eines Variablen Standort wird bei der Deklaration zero'd, sondern in C (und C ++ als auch) eine nicht initialisierte Variable enthält unabhängig von Müll, der zu dieser Zeit an diesem Ort lebt.
So ist die beste Art und Weise, daran zu denken ist, dass eine nicht initialisierte Variable wird höchstwahrscheinlich Müll enthalten und nicht definiertes Verhalten haben.
a
wird gleich Null sein, und c
auch, wenn sie global sind und nicht explizit initialisiert. Dies gilt auch für die lokale statische Variablen.
Nur lokale nicht-statische Variablen werden nicht initialisiert. Auch Speicher mit malloc ist nicht initialisiert.
Siehe here
für Regeln von Initialisierungen und Zuordnung in C für die verschiedenen Objekte.
Ich bin die Eingabe viel zu langsam an diesem Morgen. Drei Menschen tauchte in schnell wie ich antworten, also habe ich die meisten meiner Post entfernt. Der Link fand ich war kurz und knapp, so dass ich bin Entsendung dass sowieso: Wikipedia auf „nicht initialisierte Variable“ für eine Diskussion über die grundlegenden Fragen.
Ein kurzer Test zeigt a und c 0 sein.
int a;
static int c;
int main() {
printf("%d %d\n", a, c);
return 0;
}
Die Lage a (c) zur Übersetzungszeit bestimmt werden; das heißt, sie sind weder auf dem Stapel noch in einem Speicherintervall von malloc zurück setzen. Ich denke, der C-Standard, sagt sie auf 0 in allen Fällen initialisiert ist, dann.
Ich bin 99,9% zuversichtlich in Bezug auf c
und 98% zuversichtlich in Bezug auf a
. Das Schlüsselwort static
, im Zusammenhang mit der globalen Variablen, wirklich analog private
in (sagen wir) C ++ und Java. Es geht um Sichtbarkeit, nicht Lagerort
Was Andrew Hare sagt über nicht initialisierten Variablen ist für gespeicherte Daten auf dem Stack oder in malloc'd Speicher wahr. Nicht so für statisch gespeicherten Variablen.