Forum: PC-Programmierung Stack und Heap Durcheinander


von Michi (Gast)


Lesenswert?

Hallo Zusammen, ich habe eine Frage zum Thema Stack/Heap.

Beispiel Zeiger:
1
int i=0;
2
int *pZeiger=NULL;
3
pZeiger = &i;

Wird die Variable i auf dem Stack oder auf dem Heap deklariert und 
definiert? Unabhängig davon, was danach folgt. Ich gehe davon aus, dass 
es auf dem Stack geschieht, da Parameterübergaben von Funktionen auch 
über den Stack laufen.
Was passiert dann? Wird pZeiger dann auf dem Heap angelegt? Oder bezieht 
sich das Thema Stack lediglich auf Parameterlisten von Funktionen, wo 
lokale Kopien erzeugt werden?

Wie sieht es in diesem Beispiel aus:
1
int *pZeiger=NULL;
2
y=new int;
3
*pZeiger=55;
4
cout << "pZeiger: " << *pZeiger ;

Hier läuft alles über den Heap, wobei im Vergleich zum ersten genannten 
Beispiel die Deklaration und Definition einer lokalen Variable entfällt, 
oder?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michi schrieb:

> Wird die Variable i auf dem Stack oder auf dem Heap deklariert und
> definiert?

Auf dem Stack.

> Was passiert dann? Wird pZeiger dann auf dem Heap angelegt?

Bei einem vernünftigen Compiler bleibt der in einem Register, also
nichtmal Stack.  „i“ muss ja nur deshalb im Speicher landen, weil
du danach explizit eine Adresse davon nimmst und damit weiterarbeitest.

> Wie sieht es in diesem Beispiel aus:
>
1
> int *pZeiger=NULL;
2
> y=new int;
3
> *pZeiger=55;
4
> cout << "pZeiger: " << *pZeiger ;
5
>
>
> Hier läuft alles über den Heap,

Heap wäre nur für „y” ein Thema, aber das benutzt du danach nicht.

Allerdings ist sehr wahrscheinlich irgendeine Art von Trap oder
Exception des Prozessors im Spiel, es sei denn, 55 wäre in der Tat
eine gültige Adresse in deiner Architektur, von der man einen „int“
lesen kann.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Michi schrieb:
> Hallo Zusammen, ich habe eine Frage zum Thema Stack/Heap.
>
> Beispiel Zeiger:
>
1
> int i=0;
2
> int *pZeiger=NULL;
3
> pZeiger = &i;
4
>
>
> Wird die Variable i auf dem Stack oder auf dem Heap deklariert und
> definiert?

Weder noch.  Speicherklasse von i ist Static Storage.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Speicherklasse von i ist Static Storage.

Je nachdem, an welcher Stelle dieses Codeschnipsel steht: ich war in
meiner Antwort davon ausgegangen, dass es innerhalb einer Funktion
ist.

von Stefan F. (Gast)


Lesenswert?

> Wird die Variable i auf dem Stack oder auf dem Heap

Das kommt drauf an, ob sich dein Code-Fragment innerhalb einer Funktion 
oder außerhalb befindet.

Innerhalb einer Funktion belegen Variablen normalerweise Platz auf dem 
Stack. Globale Variablen, die außerhalb jeder Funktion im Quelltext 
stehen, belegen Platz außerhalb des Stack im "Data" Segment.

Der Heap ist wiederum ein dritter Speicherbereich, der durch new, 
malloc() und calloc() belegt werden kann.
1
#include <stdint.h>
2
3
int a=1;
4
5
void doSomething()
6
{
7
   int b=2;
8
   static int d=4;
9
}
10
11
int main()
12
{
13
    int* c=malloc(2); // belege 2 Bytes
14
    *c=4;
15
}

a liegt im Data Segment.
b liegt auf dem Stack, während die Funktion doSomething() läuft.
c ist ein Zeiger der sich auf dem Stack befindet. C zeigt auf einen 
Speicherbereich von 2 Bytes Größe, der im Heap befindet.
d liegt im Data Segment.

Siehe auch http://www.nongnu.org/avr-libc/user-manual/malloc.html, da 
ist die Speicheraufteilung für AVR dargestellt.

Beim avr Compiler gibt es noch das bss Segment, dort werden statische 
Variablen (in diesem Fall a und d) abgelegt, wenn sie keine 
Initialisier-Wert haben. Ich glaube, der Startwert 0 wird auch als 
"keine Initialisierung" gewertet.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Beim avr Compiler gibt es noch das bss Segment

Nicht nur bei dem.  Das Einsammeln nicht explizit initialisierter
globaler oder statischer Variablen in einem eigenen Segment ist
eine durchaus übliche Strategie.  Wenn du mal im Netz nachliest,
wofür BSS steht, wirst du feststellen, dass man das schon vor einem
halben Jahrhundert so gemacht hat. ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan U. schrieb:
>> Wird die Variable i auf dem Stack oder auf dem Heap
>
> Das kommt drauf an, ob sich dein Code-Fragment innerhalb einer Funktion
> oder außerhalb befindet.

Ich seh da keine Funktion.  Weder in Prosa noch in Code.

Und "Stack" gibt's im C++ Standard auch keinen, das sind alles Details 
der C++ Implementation, vulgo Compiler.

Und bei fast allen realen Implementations gibt's auch den 
Speicherbereich Nirwana (wegoptimiert).

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Ich seh da keine Funktion.  Weder in Prosa noch in Code.

doSomething() und main() sind Funktionen. Auf diese habe ich mich klar 
und deutlich bezogen.

> Und "Stack" gibt's im C++ Standard auch keinen

Das mag ja sein, doch erstens hat niemand gesagt, daß es um C++ geht 
(die Syntax passt ebenso zu C) und zweitens haben wir alle verstanden, 
wie der TO die Frage gemeint hat. Nur Du stellst dich gerade absichtlich 
doof, zu welchem Zweck eigentlich?

> Und bei fast allen realen Implementations gibt's auch den
> Speicherbereich Nirwana (wegoptimiert).

Es gibt definitv auf keinem Computer und in keiner Programmiersprache 
einen Speicherbereich, der Nirvana heißt oder so ähnlich heißt oder 
einen solchen Zweck erfüllt. Es hätte auch keinen Sinn, denn was weg 
optimiert ist, existiert nicht.

In Systemen mit Garbage Collector gibt es wiederum ganz andere 
Speicherbereiche - kannst ja mal darüber sinnieren, anstatt diesen 
Thread hier zu stören.

von Rolf M. (rmagnus)


Lesenswert?

Jörg W. schrieb:
> Johann L. schrieb:
>> Speicherklasse von i ist Static Storage.
>
> Je nachdem, an welcher Stelle dieses Codeschnipsel steht: ich war in
> meiner Antwort davon ausgegangen, dass es innerhalb einer Funktion
> ist.

Wo sonst? Zuweisungen außerhalb von Funktionen sind nicht erlaubt.

Stefan U. schrieb:
>> Und "Stack" gibt's im C++ Standard auch keinen
>
> Das mag ja sein, doch erstens hat niemand gesagt, daß es um C++ geht
> (die Syntax passt ebenso zu C)

Das gilt für C genauso.

> und zweitens haben wir alle verstanden, wie der TO die Frage gemeint hat.
> Nur Du stellst dich gerade absichtlich doof, zu welchem Zweck eigentlich?

Er stellt sich nicht doof, sondern erklärt, wie es in C++ eigentlich 
definiert ist. Stack, Heap u.s.w sind Implementationdetails und auf 
Ebene der Sprache nicht relevant. Das auch so zu erklären, halte ich für 
die richtige Antwort auf die Frage. Es hätte freilich etwas 
ausführlicher und freundlicher geschrieben sein können.

>> Und bei fast allen realen Implementations gibt's auch den
>> Speicherbereich Nirwana (wegoptimiert).
>
> Es gibt definitv auf keinem Computer und in keiner Programmiersprache
> einen Speicherbereich, der Nirvana heißt oder so ähnlich heißt oder
> einen solchen Zweck erfüllt. Es hätte auch keinen Sinn, denn was weg
> optimiert ist, existiert nicht.

Ach, oben mahnst du an, dass es auch bei nicht ganz korrekter Nutzung 
der Begriffe reicht, wenn man weiß, was gemeint ist, und hier wirst du 
dann auf einmal kleinlich? Passt nicht ganz zusammen.

von Nop (Gast)


Lesenswert?

Jörg W. schrieb:

> Wenn du mal im Netz nachliest, wofür BSS steht

"better save space". :-)

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.