Benny schrieb:
> Macht das erneute Initialisieren Probleme mit dem Speicherplatz? Sollte
> ich hier dann lieber 'static' verwenden oder muss ich 'i' zwingend
> außerhalb der inneren while deklarieren?
Die Variable wird nur einmal angelegt, wahlweise auf dem Stack oder als
Belegung eines CPU-Registers. Es ist kein Äquivalent zu einem
wiederholten malloc.
"static" würde die Variable persistent über die Funktionsraufrufe der
betreffenden FUnktion hinweg erhalten, wenn Du das brauchst. Dann wird
die Variable nicht auf dem Stack angelegt, sondern im Bereich der
globalen Daten (aber nur innerhalb der Funktion benutzbar), also im
BSS-Segment.
Es ist eine Frage des Programmierstils, ob man seine lokalen Variablen
im jeweiligen Block anlegt oder im Funktionskopf. Man sieht beide
Herangehensweisen, je nach Programmierer.
Vorteil beim Anlegen im jeweiligen Block: es ist klar, daß diese
Variable nur dort Gültigkeit hat, was speziell bei längeren Funktionen
übersichtlicher ist. Außerdem erlaubt es dem Compiler mehr Optimierung.
Vorteil beim Anlegen im Funktionskopf: Man sieht auf Anhieb, wieviel
Stack die Funktion verbraucht.
Interessanter wird folgender Fall:
1 | void foo(int bar)
|
2 | {
|
3 | if (bar)
|
4 | {
|
5 | char a[20];
|
6 | ...
|
7 | } else
|
8 | {
|
9 | char b[20];
|
10 | ...
|
11 | }
|
12 | }
|
Hier sollte der Compiler schlau genug sein, um zu sehen, daß er auf dem
Stack nur einmal Platz für das Array allozieren muß, weil der Scope von
a und b sich nicht überschneiden. Ob er das aber auch tut, ist die
andere Frage.