Pointer Verständnis Problemm
-
Hi Leute
ich hab mir das buch c++ von a bis z von Jürgen Wolf ausgeliehen und bin jetzt bei den pointern angekommen.
Zitat:
Ein Problem im Umgang mit Zeigern entsteht, wenn Sie einen Zeiger dereferenzieren, der auf kein gültiges Objekt zugreift - also keinen speziellen Wert erhalten hat. Beispiel:
int *iptr;*iptr = 0;
Das kapier ich schon mal nicht! und we kann man dann einem speicherplatz einen wert zuweisen?
danke
-
Du kannst einen Wert an eine Speicherstelle schreiben. Das geht jedoch nur, wenn die Speicherstelle gültig ist und Deinem Programm gehört. Du kannst nicht wild in fremdem Speicher herumschreiben.
iptr ist in Deinem Fall ein Zeiger. Ein Zeiger speichert die Adresse einer Speicherstelle, in diesem Fall einer Speicherstelle, an die ein Integer-Wert passt. Du hast diesem Zeiger aber keine Adresse zugewiesen, deshalb zeigt er auf irgendeine Adresse im Nirvana Deines Hauptspeichers. Im zweiten Schritt versuchst Du, an diese Adresse den Integer-Wert "0" zu schreiben. Da diese Adresse im höchstwahrscheinlichen Fall ungültig ist, erhälst Du im höchstwahrscheinlichen Fall einen Absturz. (Es kann auch noch ganz anderes passieren, der Witz ist hier, dass nicht definiert ist, was geschieht.)
-
Hi,
als Erstes mal was für's Auge: http://www.youtube.com/watch?v=r4-9Mh3761E .
DANN die Antwort auf Deine Frage:
Du lässt den Zeiger auf etwas zeigen, was es schon gibt, z.B.
a) weil es das "sowieso schon gibt:int i; // hier haben wir ein int int* p = &i; // p zeigt auf ioder
b) weil wir es gerade erschaffen haben:int* p = new int; // "new" legt ein neues int anDieser Weg ist für int's eigentlich Quatsch und er ist zudem noch recht riskant, weil "Selbstangelegtes" nicht von selbst wieder verschwindet, sondern ebenfalls "selbst gelöscht" werden muss (mit delete), sobald man es nicht mehr braucht.
Gruß,
Simon2.
-
Naja, ist ja echt doof da Buch, das es erst mit Problemen anfängt.
Also, Kurzfassung:
int *p = 0; // p zeigt auf Speicheradresse 0 p = 10000; // p zeigt auf Speicheradresse 10000 *p = 5; // p wird dereferenziert (s. Stern vor p!) und somit wird 5 in Addr. 10000 geschrieben p = 0; // p zeigt wieder auf Addr. 0 *p = 5; // 5 wird in Addr. 0 geschrieben... wird booom machen!
-
aja ich glaub ich habs verstanden
Danke!
-
@Artchi
Und was ist wenn an dieser Stelle schon ein WErt ist ?!
-
Foxx90 schrieb:
@Artchi
Und was ist wenn an dieser Stelle schon ein WErt ist ?!An einer (physikalisch existierenden) Adresse steht immer irgendein Wert.
-
ahh, also wenn dann nachdem man diesem speicher den Wert übergeben, und ein anderen programm und setzt sich da wieder rein is unser wert wieder weg...
-
Foxx90 schrieb:
ahh, also wenn dann nachdem man diesem speicher den Wert übergeben, und ein anderen programm und setzt sich da wieder rein is unser wert wieder weg...
Allerdings darfst du auch immer nur Speicher lesen/schreiben, den du auch explizit mit new angefordert hast. Alles andere würde zu undefiniertem Verhalten führen.
(Ausnahmen sind soweit ich weiß sppezielle Register im µC-Bereich, aber ich denke das ist eher uninteressanrt.)
-
The-Kenny schrieb:
Allerdings darfst du auch immer nur Speicher lesen/schreiben, den du auch explizit mit new angefordert hast. Alles andere würde zu undefiniertem Verhalten führen.
Nunja, wir wollen mal nicht den Speicher von automatischen, statischen und globalen Variablen vergessen

-
Naja, es ging mir jetzt um den Heap^^