PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablendeklaration in for (...)



Jaecko
12.10.2009, 10:37
Moin.

Angenommen, man hat dieses Konstrukt in einer anderen Funktion:


void Funktion1(void)
{
for (x = 0; x < 10 ; x++)
{
ui8_t* y = Funktion2(x);
}
}


Bei mir hiess es "damals", dass lokale Variablen in for-Schleifen & Co. nix zu suchen haben, sondern dass diese am Anfang der Funktion vor dem ersten Befehl deklariert werden müssen.
(Gcc scheint das egal zu sein, µVision meckert bei sowas aber kräftig rum)
Was genau hat diese Zeile in der for-Schleife für eine Wirkung?
Wird da y jedes Mal überschrieben? Oder wird da bei jedem Durchlauf ein neues y angelegt?
Was bezweckt man mit sowas?

mfG

cmock
12.10.2009, 11:33
ob das geht, hängt m.w. vom unterstützten C-standard ab, aber da bin ich nicht so der auskenner.

der effekt ist aber, daß y auf den scope begrenzt ist, in dem es definiert ist, dh. außerhalb der for-schleife existiert es schlicht und einfach nicht, und beim nächsten schleifendurchlauf hast du quasi die nächste inkarnation davon.

in deinem beispiel ist es also so, daß der wert von y sofort wieder "vergessen" wird. beim nächsten durchlauf wird ein neues y angelegt; das heißt konkret (je nach implementation, optimierungseinstellungen etc), daß auf dem stack speicher reserviert wird oder ein register verwendet wird; höchstwahrscheinlich in jedem schleifendurchlauf dasselbe, dh es wird vermutlich im nächsten schleifendurchlauf der alte wert wieder auftauchen, aber wenn du dich darauf verläßt, hast du es verdient, daß dein programm unreproduzierbar abstürzt und du ein paar nachschichten zum debuggen brauchst :-)

cm.

thewulf00
12.10.2009, 12:16
Also, wie cmock schon sagte, gilt die Variable nur innerhalb der Schleife, aber es kommt hinzu, dass der gesamte Overhead zum Anlegen einer Variable in jedem Durchlauf hinzukommt. Und die Wahrscheinlichkeit, dass y (und damit meine ich den Zeiger) dann immer an der selben Speicherstelle liegt, ist sehr hoch.