Verwendung von static in Funktionen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Verwendung von static in Funktionen

Beitrag von Bruno » Mo Nov 28, 2011 4:43 pm

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
"21" ist nur die halbe Wahrheit...

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Verwendung von static in Funktionen

Beitrag von cloidnerux » Mo Nov 28, 2011 5:00 pm

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:

Code: Alles auswählen

i: 0
i: 1
i: 2
i: 3
...
(Bei staticvariablen wirkt sich die erneute Zuweisung von 0 nicht aus)
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Verwendung von static in Funktionen

Beitrag von oenone » Di Nov 29, 2011 1:44 pm

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.

MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

Re: Verwendung von static in Funktionen

Beitrag von MoonGuy » Di Nov 29, 2011 3:34 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Verwendung von static in Funktionen

Beitrag von Xin » Di Nov 29, 2011 3:45 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Verwendung von static in Funktionen

Beitrag von Kerli » Di Nov 29, 2011 4:33 pm

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.[...]
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Verwendung von static in Funktionen

Beitrag von Xin » Di Nov 29, 2011 11:03 pm

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten