Adressraumstruktur

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Adressraumstruktur
Hey,
wo werden eigentlich lokale Variablen, die ein static haben und mit 0 oder gar nicht initialisiert sind, abgelegt? also z.B. int main(void) {static int h = 0; static int test;} ? Ich denke im BSS Segment oder im Stack.

Auch würde mich interessieren, wo eine globale Variable char *s = “test\n”; ohne static auch im Daten-Segment landet. - Ich gehe stark davon aus.

Danke!


Lokale [m]static[/m]-Variablen haben dieselbe Lebensdauer wie globale Variablen und landen damit auch in denselben Sektionen/Segmenten.

Initialisiert mit 0 (explizit oder implizit): [m].bss[/m]
Initialisiert mit anderem Wert: [m].data[/m]

Bei globalen Variablen schränkt [m]static[/m] die Sichtbarkeit auf das eigene Modul ein, ändert aber nichts an der Lebensdauer oder der Speicherzuordnung. (Jaja, es ist doof, dass [m]static[/m] in unterschiedlichen Kontexten unterschiedliche Bedeutungen hat.)

Der (veränderliche) globale Zeiger [m]s[/m] landet in [m].data[/m].
Der konstante String [m]“test\n”[/m] landet in [m].text[/m] (genau genommen in [m].rodata[/m], aber das wird in SP nicht erwähnt).


Also braucht man nicht unbedingt ein const char *s = “test\n” damit “test\n” in text landet? Also unabhängig von dem Schlüsselwort const landet es im Text? dann wäre der Inhalt des Pointers nicht veränderbar per default.


Richtig.


Ich habe noch eine Frage zur Adressraumstruktur.
Es gibt ja das Stack-Segment, BSS-Segment, Datensegment und Textsegment.
Ist Heap auch ein einzelnes Segment oder wie ist das zu verstehen bzw. wo gehört das dann genau dazu?