Stack und Heap Durcheinander

Gast #5066184
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?
Moderator Persönliche Seite #5066194
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.
Gast #5066251
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.
Moderator Persönliche Seite #5066261
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. ;-)
Persönliche Seite #5066373
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).
Gast #5066386
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.
#5066800
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren