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.