Seite 1 von 1
Verwendung von static in Funktionen
Verfasst: Mo Nov 28, 2011 4:43 pm
von Bruno
Hallo!
Eine Verständnisfrage zu static drängt sich gerade auf:
Wenn ich eine Variable als static deklariert habe, dann sollte ich doch eigentlich den Wert dieser Variable in jeder Funktion abrufen können, analog den COMMON Blöcken in Fortran
Prinzipiell dachte ich das geht so:
Code: Alles auswählen
func1()
{
static int a;
a=11;
}
func2()
{
int a;
// a =11, siehe func1
}
In meinem Programm ist aber a in func1 11 und in func2 0.
Habe ich da was falsch verstanden?
Ciao
Bruno
Re: Verwendung von static in Funktionen
Verfasst: Mo Nov 28, 2011 5:00 pm
von cloidnerux
Habe ich da was falsch verstanden?
Ja.
In C gibt es Scopes, als Betrachtungsbereiche.
Und du deklarierst a in einem Scope und versuchst auf dem Wert in einem Anderen Scope zuzugreifen und das geht nicht.
Static bedeutet, das eine Variable einen festen Speicherpunkt bekommt, aber nicht das sie Global verfügbar ist.
Als Beispiel:
Code: Alles auswählen
void foo()
{
static int i = 0;
printf("i: %d", i);
i++;
}
Wenn man diese Funktion 10 mal hintereinander aufruft würde folgendes herauskommen:
(Bei staticvariablen wirkt sich die erneute Zuweisung von 0 nicht aus)
Re: Verwendung von static in Funktionen
Verfasst: Di Nov 29, 2011 1:44 pm
von oenone
cloidnerux hat geschrieben:(Bei staticvariablen wirkt sich die erneute Zuweisung von 0 nicht aus)
Das schon, aber die Initialisierung wird nicht erneut durchgeführt. Das =0 kann man sich übrigens sparen, da statische Variablen immer mit 0 initialisiert werden.
Re: Verwendung von static in Funktionen
Verfasst: Di Nov 29, 2011 3:34 pm
von MoonGuy
oenone hat geschrieben:cloidnerux hat geschrieben:(Bei staticvariablen wirkt sich die erneute Zuweisung von 0 nicht aus)
Das schon, aber die Initialisierung wird nicht erneut durchgeführt. Das =0 kann man sich übrigens sparen, da statische Variablen immer mit 0 initialisiert werden.
Ja, aber viele Compiler spucken die Warnung, dass eine static Variable ohne Initialisierung deklariert wurde. Schlechter Programmierstil, meiner Meinung nach.
Re: Verwendung von static in Funktionen
Verfasst: Di Nov 29, 2011 3:45 pm
von Xin
oenone hat geschrieben:Das =0 kann man sich übrigens sparen, da statische Variablen immer mit 0 initialisiert werden.
Das wäre mir neu.
C macht eigentlich nichts ohne explizite Aufforderung.
Das kann z.B. bei Debug-Versionen auch anders sein.
Re: Verwendung von static in Funktionen
Verfasst: Di Nov 29, 2011 4:33 pm
von Kerli
Xin hat geschrieben:oenone hat geschrieben:Das =0 kann man sich übrigens sparen, da statische Variablen immer mit 0 initialisiert werden.
Das wäre mir neu.
Das stimmt schon. All statischen Variablen (also entweder durch static, oder weil global) werden default-Initialisiert. Bei integralen Datentypen ist das dann Null.
ISO C Standard hat geschrieben:
If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these
rules.
C++11 hat geschrieben:
The zero-initialization (8.5) of all local objects with static storage duration (3.7.1) is performed before any other initial-
ization takes place.[...]
Re: Verwendung von static in Funktionen
Verfasst: Di Nov 29, 2011 11:03 pm
von Xin
Kerli hat geschrieben:Xin hat geschrieben:oenone hat geschrieben:Das =0 kann man sich übrigens sparen, da statische Variablen immer mit 0 initialisiert werden.
Das wäre mir neu.
Das stimmt schon.
Hier bin ich Admin, hier sollst Du mich nicht zu recht kritisieren ;-D