2016-03-25 15 views
1

In diesem kurzen Beispiel eine Frage von einer Prüfung hatte ich gestern:Übernimmt eine nicht initialisierte Variable den Speicher?

int main() { 
    short a; 
} 

Does ‚a‘ besetzen jeden Speicherplatz? Als ich gemacht:

printf("%u %d\n",a, sizeof(a)); 

Ich werde ein ‚0 2‘ gedruckt, so dachte ich, die ‚0‘ gemeint war kein Gedächtnis noch initialisiert, aber mein Lehrer sagt ja, es bereits 2 Byte belegt.

Danke, Dani.

+0

In der Funktion ohne 'printf()', wird die Variable wegoptimiert, weil sie nicht verwendet wird. Mit 'printf() 'rufen Sie ein undefiniertes Verhalten auf, weil Sie eine nicht initialisierte Variable referenzieren (drucken) - der Wert ist sicher nicht 0. –

+1

Ihre Frage enthält eine nicht initialisierte Variable (keine initialisierte wie der Titel) –

+0

Das Drucken einer nicht initialisierten Variablen (tatsächlich jedes Zugriffs auf seinen Wert) führt zu undefiniertem Verhalten. – Peter

Antwort

2

Speichert eine initialisierte Variable den Speicher?

Ja. Ich vermute, Sie wollten nicht initialisiert dort verwenden. Die Antwort ist immer noch Ja.

Wenn Sie den Wert einer nicht initialisierten Variablen verwenden, wie im Aufruf von printf, unterliegt das Programm einem nicht definierten Verhalten.

sizeof(a) wird jedoch zur Kompilierzeit berechnet. Es hängt nicht davon ab, ob die Variable initialisiert ist oder nicht.

3

Die richtige Antwort ist "vielleicht". Der Compiler muss dir die Illusion geben, dass er das Gedächtnis einnimmt, und in den meisten praktischen Fällen wird es dies tun.

Der Compiler kann jedoch tun, was er will, solange er diese Illusion aufrechterhält. In Ihrem Beispiel ohne printf wird die Variable a niemals verwendet. Der Compiler ist frei, ihn zu optimieren, so dass er keinen Speicher benötigt. Tatsächlich passiert das häufig, wenn Sie Optimierungs-Flags aktivieren, z. B. -O3 für gcc.

1

Wenn Sie short a; deklariert haben, weist der Compiler Speicher für a zu, und dieser Speicher enthält einige unbestimmte Werte. In diesem Fall könnte es 0 und das ist, was Sie bekommen, aber das Verhalten des Programms ist undefiniert und nichts kann gesagt werden.

0

Ja. Eine deklarierte Variable belegt Platz. Und sizeof Operator gibt die Größe des kurzen Datentyps zurück.

Auch wenn Sie "a" nach der Deklaration nicht verwendet haben - zum Beispiel, Sie initialisieren es nicht oder verwenden es irgendwo anders im Code - könnte der Compiler die Möglichkeit haben, es zu optimieren.

+0

Beachten Sie, dass die Variable und ihre Initialisierung auch dann, wenn sie initialisiert wird, wenn der Wert nicht verwendet wird, außerhalb des Codes optimiert werden können. –

1

Das hängt von vielen Faktoren ab.

Zunächst kann der Optimierer diese Variable vollständig löschen (oder nicht). Obwohl es nicht wirklich der Fall in Ihrem Stück Code ist, wenn Sie es wirklich in printf Aufruf verwenden (was UB ist, wie andere Notiz).

Als nächstes, was meinst du mit "occupancy memory"? Hier wird der Compiler höchstwahrscheinlich einen Teil des Stack-Speichers verwenden, der ohnehin für den Prozess reserviert sein sollte. Und wenn es nicht in main() wäre, dann wäre dieser Speicher bei der Rückgabe der Funktion freigegeben worden. Es ist also keine "praktische" Verschwendung.

Ich dachte, die '0' noch

Nope initialisiert wurde kein Speicher gemeint. Wenn man "initialisiert" sagt, bedeutet er "auf einen bekannten Wert initialisiert". Auf der anderen Seite bedeutet "nicht initialisiert" nicht "nicht Null", sondern eher "irgendein Müll"/"Ich weiß nicht"/"Es ist mir egal" usw.

Verwandte Themen