C: Großes Array lokal oder global?

Gast #4207816
Lesenswert?
• ▲
▼
Hallo zusammen,
Habe ja mittlerweile mein TFT Display ans laufen bekommen.
Das ganze Handling des Display ist in einer Funktion, die von Main 
zyklisch aufgerufen wird.
Unter anderem möchte ich auf dem Display ein Trend-Chart darstellen, der 
halt Messwerte über dei Zeit darstellt.
Vom Main wird nur der aktuelle Messwert übertragen.
In der Funktion vom Display würde ich ein lokales Array " Static int 
[1000]" anlegen, um die Messwerte zu speichern.
Könnten später aber auch noch mehr Werte werden.
Ist es so, dass lokale Variablen immer im Stack gespeichert werden ?
Besteht die Gefahr eines Stack Overflow ?
Wäre es besser, diese große Datenmenge global zu definieren ?

Gruß Dirk
Moderator #4207840
Lesenswert?
• ▲
▼
DirkF schrieb:
> Ist es so, dass lokale Variablen immer im Stack gespeichert werden ?
> Besteht die Gefahr eines Stack Overflow ?

Nicht wenn du static davorschreibst, wie du es ja getan hast.

> Wäre es besser, diese große Datenmenge global zu definieren ?

Globale Variablen sollte man nur dann verwenden, wen wirklich mehrere
Funktionen darazuf zugreifen können müssen.
#4207843
Lesenswert?
• ▲
▼
DirkF schrieb:
> Ist es so, dass lokale Variablen immer im Stack gespeichert werden ?

Eigentlich ja, aber static Variablen sind keine gewöhnlichen lokalen 
Variablen und werden in der BSS Section gespeichert.

DirkF schrieb:
> Besteht die Gefahr eines Stack Overflow ?

Der besteht immer, wenn man im Vergleich zum verfügbaren RAM große 
Variablen speichern möchte. Ob die Variablen auf dem Stack, der BSS 
Section oder sonstwo gespeichert werden macht dabei keinen Unterschied. 
Der Unterschied liegt einzig darin was der Compiler schon zur 
Compilezeit herausfinden kann. Bei globalen oder static Variablen weiß 
der Compiler wie viel Speicher diese brauchen und man kann sich nach dem 
Compilieren die Größe der BSS Section anschauen, um zu sehen wie viel 
Speicher noch für den Stack übrig ist. Herauszufinden wie viel Stack in 
allen möglichen Codepfaden des Programms maximal benötigt wird ist 
dagegen ein nicht triviales Problem.

DirkF schrieb:
> Wäre es besser, diese große Datenmenge global zu definieren ?

Deine Frage bezieht sich ja auf static lokal vs. global. Da beides in 
der BSS Section landet ist es egal.
Gast #4207848
Lesenswert?
• ▲
▼
"Statics" landen nie auf dem Stack - egal ob global oder lokal.  Der 
benötigte Speicherplatz wird während der Compilierung "statisch" 
zugewiesen und ist für die gesamte Laufzeit des Programs für genau diese 
Variable explizit reserviert.
Gast #4207851
Lesenswert?
• ▲
▼
Hi,

lokale statische Variablen werden auf dem Heap und nicht auf dem Stack 
abgelegt.
Nicht statische lokale Variablen landen auf dem Stack. Zum Stackoverflow 
kommt es, wenn die eine Funktion eine andere aufruft, die wieder eine 
andere usw. und all diese Funktionen in Summe zu viel Stack für ihre 
lokalen Variablen benötigen. In den Heap verschoben, also static 
deklariert, würden diese Variablen aber nun am Heap nagen, und andere 
Funktionen werden dann in den Stackoverflow getrieben: es zählt der 
Gesamtverbrauch des Speichers, also Heap plus Stack.

Sind die Funktionsaufrufe solcher Stack-Verbraucher dagegen nicht 
verschachtelt, kann jeder mehr Stack verbrauchen. In einem solchen 
Szenario dann die lokalen Variablen mit der static-Deklaration in den 
Heap zu verschieben, gleicht dann einem Suizid.

Grüße, Markus

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.