Forum: Compiler & IDEs Variablen innerhalb eine Funktion


von Manuel (Gast)


Lesenswert?

Hallo,

hab eine ganz grundlegende C-Frage: Hab eine Funktion, die öfter 
aufgerufen wird (ca alle 100µs), innerhalb dieser Funktion werden 
variablen definiert.
1
void funktion()
2
{
3
   int i = 0;
4
   bool j = false;
5
   .
6
   .
7
   .
8
9
}

Problemstellung: diese Variablen sollen bei jeden Aufruf mit 0 
initialisiert werden ( weil sie innerhalb der Funktion verändert 
werden).
So wie es oben geschrieben ist, werden die Variablen nun zu Beginn jedes 
Funktionsaufrufes auf Null gesetzt, aber wird dabei nicht auch immer 
eine neue Variable erzeugt??? Nach dieser Theorie sollte nach X 
Funktionsaufrufen der Speicher voll sein?!

Wenn ich sie als static deklariere, hab ich das Problem, dass sie nie 
wieder zurück auf 0 gesetz wird, oder?

Danke für eure Hilfe..

von Peter II (Gast)


Lesenswert?

Manuel schrieb:
> Nach dieser Theorie sollte nach X
> Funktionsaufrufen der Speicher voll sein?!

nein, denn die variabel liegen auf dem Stack und dieser wird beim 
beenden der Funktion wieder aufgeräumt

von Cyblord -. (cyblord)


Lesenswert?

Die (lokalen) Variablen werden nur auf dem Stack angelegt und am Ende 
der Funktion wieder zerstört.
Probleme gibts nur bei häufigen rekursiven Aufrufen.

gruß cyblord

von ozo (Gast)


Lesenswert?

Moin,

der Funktionsaufruf wird über den Stack abgewickelt. Nach dem Verlassen 
der Funktion wird der Stack wieder freigeräumt.
Siehe 
http://en.wikipedia.org/wiki/Call_stack#Functions_of_the_call_stack

Grüße

von Karl H. (kbuchegg)


Lesenswert?

Manuel schrieb:
> Hallo,
>
> hab eine ganz grundlegende C-Frage:

Dafür gibt es C-Bücher.
Da stehen noch viele andere Grundlagen drinnen.

> Hab eine Funktion, die öfter
> aufgerufen wird (ca alle 100µs), innerhalb dieser Funktion werden
> variablen definiert.

ja, soll vorkommen.

> Problemstellung: diese Variablen sollen bei jeden Aufruf mit 0
> initialisiert werden ( weil sie innerhalb der Funktion verändert
> werden).

ja, ist ok.

> So wie es oben geschrieben ist, werden die Variablen nun zu Beginn jedes
> Funktionsaufrufes auf Null gesetzt,

genau das hast du programmiert.

> aber wird dabei nicht auch immer
> eine neue Variable erzeugt???

Ja und Nein.
Denn nachdem die Funktion fertig ist, werden die Variablen wieder 
zerstört.

> Nach dieser Theorie sollte nach X
> Funktionsaufrufen der Speicher voll sein?!

Nö.
Denn beim Verlassen der Funktion werden diese Variablen ja wieder 
zerstört.

> Wenn ich sie als static deklariere, hab ich das Problem, dass sie nie
> wieder zurück auf 0 gesetz wird, oder?

Richtig.
Dann wirst du sie wohl händisch mit einer Zuweisung auf dir genehme 
Werte zurücksetzen müssen.
Das folgt aber eigentlich recht klar daraus, wie static Variablen 
verwaltet werdenm, bzw. was eine Initialisierung eigentlich ist und was 
sie von einer Zuweisung unterscheidet.

von Manuel (Gast)


Lesenswert?

Alles klar, vielen Dank!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

cyblord ---- schrieb:
> Die (lokalen) Variablen werden nur auf dem Stack angelegt

Nur, wenn der Prozessor zu wenig Register hat. ;-)

Bei Prozessoren mit ausreichend vielen Registern (also so ziemlich
alles außer x86 :) sehen die lokalen Variablen oft genug den Speicher
gar nicht, sondern verbleiben gleich komplett in Registern.

Was gar nicht benutzt wird (beispielsweise in Teilen des Codes), legt
der Compiler gar nicht erst an.  Also bei:
1
void foo(bool x)
2
{
3
  int i;
4
  char j;
5
6
  if (x) {
7
    i = 42;
8
    // ...
9
  } else {
10
    j = 'B';
11
    // ...
12
  }
13
}

werden i und j nie gleichzeitig gebraucht; folglich kann jede der beiden
Variablen mit dem gleichen Register auskommen (oder der gleichen
Speicherstelle).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.