Forum: Mikrocontroller und Digitale Elektronik Static vor Variablen


von Fragenix (Gast)


Lesenswert?

Hallo,


static int c = 2; // Modulglobal


void Funktion1(void)
{
   static int a = 5;
   int b = 3;

   a++;
   b++;
   c++;

   Funktion2(&a);   // sollte OK sein! oder? (Das möchte ich wissen.)
   Funktion2(&c);   // Ist OK!
   Funktion2(&b);   // Ist bedingt OK.
                    // Sobald Funktion1 beendet, darf nicht mehr auf die
                    // an Funktion2 übergebene Adresse zugegriffen 
werden.
                    // Besser nicht machen.
}



void Funktion2(int *p)
{

}


Seht ihr das auch so?

von Michael R. (dj_motionx)


Lesenswert?

Fragenix schrieb:
> Funktion2(&a);   // sollte OK sein! oder? (Das möchte ich wissen.)


ja ist ok ! hätte ich auch so gesehen.

von Knut (Gast)


Lesenswert?

Dumme Frage, worin besteht der Unterschied zu:
1
Funktion2(eine der Variablen);

und der obigen Pointervariante?

Knut

von Michael R. (dj_motionx)


Lesenswert?

Mit
Funktion2(&a);
wir die Adresse der Variable a als Parameter an die Funktion Funktion2 
übergeben.
Funktion2(a);
Übergibt den Wert der Vaiable als Kopie.
Stichwort: call by value und call by reference.

Hast du das gemeint ?

von Karl H. (kbuchegg)


Lesenswert?

Knut schrieb:
> Dumme Frage, worin besteht der Unterschied zu:
>
>
1
> Funktion2(eine der Variablen);
2
>
>
> und der obigen Pointervariante?
>

In dem einen Fall gibst du dem Zöllner eine Kopie deines Reisepasses. 
Wenn der dann darin rummalt, verändert er nur die Kopie und nicht das 
Original.

Im anderen Fall gibst du ihm die Information, wo dein Reisepass steckt 
(in der Jackentasche). Wenn er dann mithilfe dieser Information den 
Reisepass ausfindig macht und darin herummalt, verändert er das 
Original.

von Michael R. (dj_motionx)


Lesenswert?

Karl Heinz Buchegger schrieb:
> In dem einen Fall gibst du dem Zöllner eine Kopie deines Reisepasses.
> Wenn der dann darin rummalt, verändert er nur die Kopie und nicht das
> Original.
>
> Im anderen Fall gibst du ihm die Information, wo dein Reisepass steckt
> (in der Jackentasche). Wenn er dann mithilfe dieser Information den
> Reisepass ausfindig macht und darin herummalt, verändert er das
> Original.

Netter Vergleich muss ich mir merken :-)

von Knut (Gast)


Lesenswert?

@ Karl Heinz:

Schönes Beispiel, habs begriffen.



Knut

von Karl H. (kbuchegg)


Lesenswert?

Geht noch weiter (wie ich gerade merke)

Die Information wo der Reisepass steckt bekommt der Zöllner in Form 
eines Zettels auf dem stehe: "Der Reisepass ist in der Jackentasche"
Der Zöllner behält sich den Zettel

2 Wochen später kommst du wieder zur Grenze und der Zöllner sieht auf 
den Zettel: Aha, der Reisepass ist in der Jackentasche.

Dummerweise hast du aber eine andere Jacke an und dort steckt der Pass 
in der Brusttasche. Das weiß aber der Zöllner nicht, der vertraut dem 
Zettel den du ihm früher mal gegeben hast blind.

Und da er den Pass daher logischerweise nicht in der Jackentasche finden 
wird, gibst vom Zoll eines auf die Mütze.

von Mathias A. (mrdelphi)


Lesenswert?

Fragenix schrieb:
>    Funktion2(&a);   // sollte OK sein! oder? (Das möchte ich wissen.)

ja

>    Funktion2(&c);   // Ist OK!

ja

>    Funktion2(&b);   // Ist bedingt OK.
>                     // Sobald Funktion1 beendet, darf nicht mehr auf die
>                     // an Funktion2 übergebene Adresse zugegriffen
> werden.
>                     // Besser nicht machen.

stimmt, ist aber trotzdem ok, da Funktion1 ja nicht beendet wird solange 
Funktion2 noch läuft.



Michael Rathmair schrieb:
> Funktion2(a);
> Übergibt den Wert der Vaiable als Kopie.
> Stichwort: call by value und call by reference.

Frage am Rande, macht C eigentlich nicht in dem Fall u.U. auch implizit 
ein call by ref wenn Funktion2 wie hier einen pointer erwartet?

von Karl H. (kbuchegg)


Lesenswert?

Mathias A. schrieb:

> Frage am Rande, macht C eigentlich nicht in dem Fall u.U. auch implizit
> ein call by ref wenn Funktion2 wie hier einen pointer erwartet?

Ja.
Der Pointer wird natürlich 'per value' übergeben.
Aber im Endeffekt läuft es für den Wert auf den der Pointer zeigt auf 
einen Call by Reference hinaus.

von mh123 (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Dummerweise hast du aber eine andere Jacke an und dort steckt der Pass
> in der Brusttasche. Das weiß aber der Zöllner nicht, der vertraut dem
> Zettel den du ihm früher mal gegeben hast blind.
>
> Und da er den Pass daher logischerweise nicht in der Jackentasche finden
> wird, gibst vom Zoll eines auf die Mütze.

Neinneinnein. Um die Analogie richtig weiterzuspinnen, müsste es heißen:

Da der Zöllner streng nach Vorschrift arbeitet, fasst er in Deine 
Jackentasche, holt heraus was sich dort drin befindet und malt drin 
herum.

Wenn Du das Zeug in Deiner Jackentasche nicht mehr brauchst, hast Du 
"nur" dir Arbeit des Zöllners verloren. Aber vielleicht steckte in 
Deiner Jackentasche diesmal die Adresse, zu der Du fahren wolltest (= 
eine andere Variable oder Funktion). Und da auch Du blind vertraust, 
dass die Angaben in Deiner Jackentasche immer so sind, wie Du sie 
hineingesteckt hast, nimmst Du die Zoll-Einträge jetzt als 
Wegbeschreibung. Und jetzt kommt es zu unvorhersehbarem Verhalten bis 
hin zu Unfällen mit Todesfolge.

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.