Dynamische Speicherverwaltung?

Wenn ich innerhalb einer Funktion Variablen oder Arrays von Variablen deklariere (welche ich wegen der Uebersichtlichkeit nicht global deklarieren moechte, da ich sie ausschliesslich innerhalb der Funktion benoetige),

void Example() {
    ...
    int buffer;
    byte bullshit[100];
    ...
}

wird dann nach dem Beenden dieser Funktion der verwendete Speicher automatisch wieder freigegeben?

Danke,

Helmuth

Das hat nichts mit dynamischem Speicher zu tun. Dynamischer Speicher ist wenn du Speicher permanent auf dem Heap mit malloc() (C) oder new (C++) anlegst:

Das ist das genaue Gegenteil. Hier wird nur temporär Speicher auf dem Stack angelegt und am Ende der Funktion wieder freigegeben.

Aha. Verwirrend.
Warum heisst das dann nicht statischer Speicher, wenn ich den "Speicher permanent auf dem Heap (...) anlege"?

Ich frage eigentlich, weil ich neulich das Problem hatte, dass ein 3kB Array innerhalb einer Funktion zum Crash nach wenigen Sekunden gefuehrt hat. Exakt der gleiche Code lief, nachdem ich das Array testweise global deklariert habe.

Gruesse

Helmuth

"permanent" ist etwas unglücklich ausgedrückt. Den Speicher kann man schon wieder freigeben. Aber man muss es in C/C++ per Hand machen. Der Speicher ist solange belegt, bis man in selbst wieder freigibt. Und wenn man das vergisst verliert man Speicher (memory leak).
Wobei es Sprachen gibt die das automatisch im Hintergrund machen wenn keine Variable oder kein Objekt mehr existiert dass darauf verweist (z.B. Java, C#, VB .NET oder Python).

Ich frage eigentlich, weil ich neulich das Problem hatte, dass ein 3kB Array innerhalb einer Funktion zum Crash nach wenigen Sekunden gefuehrt hat. Exakt der gleiche Code lief, nachdem ich das Array testweise global deklariert habe.

Das kommt wahrscheinlich darauf wie der Speicher genau organisiert ist. Das wird auf einem ARM Prozessor auch anders sein als auf einem AVR.

Für den AVR ist das hier erklärt:
http://www.nongnu.org/avr-libc/user-manual/mem_sections.html
http://www.nongnu.org/avr-libc/user-manual/malloc.html

Wenn man sich das grob ansieht sollte es keinen Unterschied machen, aber da wird es vielleicht noch irgendwelche Feinheiten geben

Ich frage eigentlich, weil ich neulich das Problem hatte, dass ein 3kB Array innerhalb einer Funktion zum Crash nach wenigen Sekunden gefuehrt hat. Exakt der gleiche Code lief, nachdem ich das Array testweise global deklariert habe.

Globale Variable werden evtl. überschrieben, was nicht weiter weh tut, wenn sie nicht verwendet werden.
Lokale Variable auf dem Stack führen dazu, dass der Stackbedarf viel größer wird und andere Sachen auf dem Stack ( Rücksprungregister, andere Register) in Bereichen landen, wo sie eigentlich nicht hingehören, und dort überschrieben werden. → Peng !

“Exakt der gleiche Code” ist das natürlich nicht :wink:

Das Wichtigste und Fehleranfälligste am Code sind die Variablendeklarationen.

michael_x:
Globale Variable werden evtl. überschrieben, was nicht weiter weh tut, wenn sie nicht verwendet werden.
Lokale Variable auf dem Stack führen dazu, dass der Stackbedarf viel größer wird und andere Sachen auf dem Stack ( Rücksprungregister, andere Register) in Bereichen landen, wo sie eigentlich nicht hingehören, und dort überschrieben werden. -> Peng !

Also in den Funktionen lokale Variabeln mit viel Speicherverbrauch zu definieren ist keine gute Idee.
Verstehe das aber nicht wirklich - auf dem Stack sollten doch nur die Rücksprungdressen und die Register gesichert werden.

Werden da wirklich auch lokale Variabeln einer Funktion auf den Stack gelegt ?

Ja:

Wo sollen die denn sonst landen? Das ist ja der Grund weshalb man keinen Zeiger auf lokale Variablen zurückgeben kann.

Die Ausnahme sind natürlich lokale static Variablen