mikrocontroller.net

Forum: Compiler & IDEs Dynamische Speicher Reservierung


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

da ich noch etwas in den Anfängen mit C stehe mal eine Frage an die
Profs. Die Funktion unten reserviert Dynamisch und NICHT zur compile
Zeit ein unsigned char array. Wo wird dieses eigentlich abgelegt?
Stack oder RAM? Ist es sinnvoll so etwas zu machen oder doch eher zu
riskant? Der Compiler bringt zumindest keine Warnung.

void foo ( unsigned char Test )
{
   unsigned char MyBuffer[Test];
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wo wird dieses eigentlich abgelegt?
> Stack oder RAM?

Auf dem Stack.  Und der liegt im RAM. ;-)

> Ist es sinnvoll so etwas zu machen oder doch eher zu
> riskant?

Das hängt davon ab, was du damit machen willst.  Du kannst
natürlich dein Array statisch allozieren, dann ist der zugehörige
RAM ein für allemal dafür reserviert, egal ob er gerade gebraucht
wird.  Dafür hat das entsprechende Objekt eine unendliche
Lebenszeit.

Bei einer dynamischen Zuteilung musst du halt sauber analysieren,
dass du stets genug freien RAM zur Verfügung hast.  Dabei ist es
in erster Linie unerheblich, ob die Belegung auf dem Stack
erfolgt (wie hier) oder auf dem Heap (malloc()), die Stack-Variante
hat lediglich den Vorteil, dass sie nicht fragmentieren kann: die
Objekte werden beim Verlassen der Funktionen von unten nach oben
wieder abgeräumt, damit steht immer wieder ein zusammenhängender
Speicherblock (für den Stack neuer Funktionen) zur Verfügung.

Aber damit sollte dir natürlich auch der größte Pferdefuß soeben
klar geworden sein: MyBuffer[] existiert nur innerhalb von foo(),
danach ist der entsprechende Speicher nicht mehr reserviert und
wird dem nächsten Bedürftigen auf Antrag verteilt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.