reinterpret_cast<>
-
Bei folgendem Beispiel:
#include <iostream> #include <string> using namespace std; void func(int a); int main() { char *pText = "Text"; long lVal; lVal = reinterpret_cast<long>(pText); return 0; }Ich verstehe nicht, wie man "Text" in eine long Variable reinpressen kann. 1. Warum geht das überhaupt, in long sind doch Zahlen, und "Text" ist ja Buchstaben. Was soll den dann genau in der Variable drin stehen?
2. Und was ist n eigentlich der Sinn davon?
MfG
Stromberg
-
Du presst nicht die Buchstaben rein, sondern nur den Zeiger
Zeiger sind ja Adressen, also auch nur Zahlen, deshalb ist das relativ problemlos möglich (wenn die Größe passt).
-
Davon abgesehen sind letztendlich auch Buchstaben nur Zahlen, bzw. man kann sie als solche darstellen.
Siehe:
http://de.wikipedia.org/wiki/ASCII
-
Aber dann bringt mir die long Variable doch eigentlich nix, oder? Mit der kann ich doch jetzt net direkt da irgendwie auf das Wort "Text" zugreifen. Ich könnte doch höchstens wieder einen reinterpret_cast von der long Variable auf einen anderen char Zeiger machen oder?
Also:#include <iostream> #include <string> using namespace std; void func(int a); int main() { char *pText = "Text"; long lVal; lVal = reinterpret_cast<long>(pText); char *p= reinterpret_cast<char*>(lVal); cout << p << endl; return 0; }arg viel mehr Möglichkeiten gibts doch auch nicht oder?
MfG
Stromberg
-
#include <iostream> #include <string> using namespace std; void func(int a); int main() { char *pText = "Text"; long *lVal; lVal = reinterpret_cast<long*>(pText); std::cout << &lVal; return 0; }War das deine Absicht?
EDIT://
IMO müsste es const char * pText = "Text" heißen
-
Ich hatte keine Absicht, ich erkenne nur noch nicht so richtig den Sinn, was ich damit anfangen kann wenn ich einen Zeiger in einer long Variable habe, udn was ich genau damit dann anfangen kann.....über die long Variable kann ich den Zeiger Inhalt ja nicht ansprechen.....der Sinn is bei von dem allen noch nicht so ganz da.
MfG
Stromberg
-
Stromberg schrieb:
Aber dann bringt mir die long Variable doch eigentlich nix, oder? Mit der kann ich doch jetzt net direkt da irgendwie auf das Wort "Text" zugreifen. Ich könnte doch höchstens wieder einen reinterpret_cast von der long Variable auf einen anderen char Zeiger machen oder?
Direkt nicht. Deswegen lässt man reinterpret_cast ja auch, wenn man keinen sehr guten Grund dafür hat.
Aber schau dir mal folgendes Beispiel an. Soweit ich weiss, ist das Verhalten von dem, was ich da mache, undefiniert, aber mit etwas Glück funktioniert es bei dir:#include <cstdlib> #include <iostream> using namespace std; int main() { char *pText=new char[5]; memcpy(pText,"Text",5); long* lptr=reinterpret_cast<long*>(pText); *lptr=1952998727; cout << pText << endl; delete[] pText; }
-
Stromberg schrieb:
Ich hatte keine Absicht, ich erkenne nur noch nicht so richtig den Sinn, was ich damit anfangen kann wenn ich einen Zeiger in einer long Variable habe, udn was ich genau damit dann anfangen kann.....über die long Variable kann ich den Zeiger Inhalt ja nicht ansprechen.....der Sinn is bei von dem allen noch nicht so ganz da.
MfG
StrombergDaher mein Beispiel. mit dem kannst du direkt auf den Inhalt zugreifen
du musst halt "richtig" casten (reinterpret_cast<> nur im äußersten Notfall!)
-
Nanyuki schrieb:
Soweit ich weiss, ist das Verhalten von dem, was ich da mache, undefiniert, aber mit etwas Glück funktioniert es bei dir:
Ich sehe kein per se undefiniertes Verhalten - natürlich ist die genaue Bedeutung von der Implementation abhängig.
-
camper schrieb:
Ich sehe kein per se undefiniertes Verhalten - natürlich ist die genaue Bedeutung von der Implementation abhängig.
Ich war mir nicht ganz sicher, ob der Standard es vorschreibt, dass dieser Codeschnippsel zu funktionieren hat (passende Größenverhältnisse von char und long vorausgesetzt).
Ich schätze mal, dass ich mir den Standard bei Gelegenheit zu Gemüte führen muss.
-
@Stromberg:
reinterpret_cast ist für low-level Spielereien da.
Primär gibt es 2 Anwendungen (die ich kenne):- Umwandeln von A* in B* (z.B. int* in char* damit man byteweise auf das Speicherabbild eines ints zugreifen kann)
- Umwandeln von A* in einen int/long/long long oder zurück.
(1) braucht man oft wenn man Daten serialisieren/deserialisieren möchte. (2) braucht man öfters wenn man irgendwo ein "userdata" Feld hat wo man aber nen Zeiger ablegen muss.
Dass das Verhalten "implementation defined" ist heisst nicht dass reinterpret_cast unbrauchbar ist, sondern nur dass man damit nicht 100% plattformunabhängigen Code schreiben kann. Dort wo reinterpret_cast zum Einsatz kommt ist das aber meistens egal, da man dort üblicherweise sowieso schon mit plattformabhängigen APIs arbeitet.
Dass du für "normale" Programme keinen geeigneten Einsatzzweck findest ist also "normal"
