Deklaration mehrfach ausgeführt: Was passiert da?
-
Hallo Forum,
was passiert bei diesem Source?
while (1) { int i; }
Wird da bei jedem Durchgang i neu angelegt? Das der Wert von i erhalten bleibt ist mir klar, mir geht es darum was beim zweiten Ausführen der "int i" Anweisung passiert.
Vielen Dank
-
Der Wert von i bleibt nicht erhalten.
Rein technisch gesehen dürfte der Speicherplatz für i bereits vor der Schleife angelegt werden, allerdings ist der Zugriff nur innerhalb der Schleife möglich. Rein technisch gesehen könnte im nächsten Schleifendurchlauf sogar derselbe Wert drinstehen wie im vorhergehenden, aber das garantiert Dir niemand. Wenn Du darauf angewiesen bist, dass der Wert erhalten bleibt, definiere die Variable vor der Schleife. Weiterhin dürfte in dieser Zeile garnichts passieren, solange keine Initialisierung ergänzt wird.
[C++-Tech.]
In C++ würde, wenn es sich nicht um ein Integer, sondern ein Objekt handeln würde, in jedem Schleifendurchlauf der Konstruktor durchgeführt. Rein technisch gesehen wiederum vermutlich immer auf demselben Stück Speicher.
-
ZubX schrieb:
mir geht es darum was beim zweiten Ausführen der "int i" Anweisung passiert.
bei jedem schleifendurchlauf bekommst du ein neues 'i'.
das vorherige 'i' existiert dann nicht mehr...
-
i wird beim eintritt in die schleife auf dem stack angelegt (genauer: platz reserviert) und am ende der schleife wieder von dort gelöscht. in den meisten fällen dürfte diese stackposition (rein zufällig) immer an der selben physikalischen stelle im speicher stehen, weshalb i erhalten bleiben könnte.
wenn du dich darauf verlässt, bist du ein mieser programmierer.
-
Ernstmal vielen Dank
Das mit dem Stack wollte ich höhren: Wird die Variable bei jedem Schleifendurchgang vom Stack heruntergenommen und dann wieder draufgelegt?
-
wird wohl systemabhängig sein
-
LordJaxom schrieb:
Weiterhin dürfte in dieser Zeile garnichts passieren, solange keine Initialisierung ergänzt wird.
wenn die variable zwar initialisiert, aber niemals verwendet wird, wird auch nichts passieren (es sei denn man schreibt 'volatile' davor).
-
Dann definiere ich sie lieber ausserhalb. Vielen Dank Euch allen
-
vista schrieb:
wenn die variable zwar initialisiert, aber niemals verwendet wird, wird auch nichts passieren (es sei denn man schreibt 'volatile' davor).
Selbst wenn die Variable initialisiert und verwendet wird, kann der Compiler sie noch aus dem Speicher rausoptimieren - aber das sind Spitzfindigkeiten, da es hierbei wohl um das Verhalten "nach aussen" geht, und man annehmen kann dass keine Threads parallel in dem Speicher rumwursten
-
LordJaxom schrieb:
Selbst wenn die Variable initialisiert und verwendet wird, kann der Compiler sie noch aus dem Speicher rausoptimieren
richtig.
das habe sich schon oft erlebt.
-
ZubX schrieb:
while (1) { int i; }
sollte man bei ansi c nicht alles davor deklarieren oO ?
-
Ab C99 geht das so wunderbar.
-
Am Anfang eines Scopes (sprich: nach "{") geht das auch in C89 wunderbar. Ab C99 sogar mittendrin.
-
Stimmt natürlich. Ich Idiot ich.