Forum: Compiler & IDEs Array auf dem Stack.


von mitleser (Gast)


Lesenswert?

Hallo zusammen


Ich überlege grade warum folgendes Konstrukt funkioniert:
1
int main(void)
2
{
3
    uint8_t array[128];
4
5
    // array mit Werten belegen
6
7
    foo(array);
8
}
9
10
11
void foo(uint8_t *parray)
12
{
13
    blablabla
14
}

Das array wird in main auf dem Stack erzeugt. Warum kann ich dann von 
foo aus (also ausserhalb von main) auf das array zugreifen? Ist diese 
Konstruktion erlaubt?
Das ganze funktioniert zwar aktuell, kommt mir aber irgendwie komisch 
vor...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist zulässig. Das Array (wie auch jede andere automatische 
Variable) ist solange gültig, wie der Block, in dem es angelegt wurde, 
noch nicht verlassen wurde. Ein Funktionsaufruf innerhalb eines Blockes 
beendet den Block nicht, das wäre ja auch fatal, denn dann könntest Du 
nach dem Aufruf von foo in main nicht mehr auf die Variablen zugreifen.

von U.R. Schmitt (Gast)


Lesenswert?

Weil du nur innerhalb der Funktion main zugreifst in der das Array lokal 
definiert wurde. Du bist innerhalb von main wenn du foo() aufrufst.

Übrigens, auch wenn "array" kein Schlüsselwort in C ist ist es nicht 
besonders geschickt eine Variable "array" zu benennen, nehme lieber 
einen sprechenderen Namen der ausdrückt was da drin steht.

von andy (Gast)


Lesenswert?

>Das array wird in main auf dem Stack erzeugt. Warum kann ich dann von
>foo aus (also ausserhalb von main) auf das array zugreifen? Ist diese
>Konstruktion erlaubt?

du benutzt doch die Funktion foo() innerhalb der Main und übergibst den 
Pointer aufs Array???

von mitleser (Gast)


Lesenswert?

O.K. Das ist also so erlaubt.
Ich hab mich ein wenig vom "lokalen array" verwirren lassen. Da ich beim 
beim Ausführen von "foo()" main noch nicht verlassen habe ist das array 
noch am Leben.

>nicht besonders geschickt eine Variable "array" zu benennen,
Ja ist klar. Das sollte nur zur Demonstration dienen ;-)


Danke noch mal...

von ET-Tutorials (Gast)


Lesenswert?

Vielleicht hilft Dir dieses Video, bzgl. des Speicherortes.

http://et-tutorials.de/2276/funktionen-in-c-globale-und-lokale-variablen/

von XXXoom (Gast)


Lesenswert?

Solange sich der Stackpointer oberhalb der Adressen befindet, an denen 
das Array abgelegt sind, sind die Daten noch gültig.

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.