Wie kann man einem Pointer/Zeiger die Adresse manuell zuweisen?
-
Wie oben schon gefragt. Ich habe schon gegooglet und auch herumprobiert aber leider beides ohne erfolg.
int* x; x = 0012FD9C;
War nicht erfolgreich, ebenso wie einige andere versuche.
Der wert "0012FD9C" ist nicht zufällig, ich habe in einem anderen Programm die Speicheradresse mittels &Variable ausgegeben, um sie von dem anderen Programm aus zu verändern. Ich lerne im moment C++ mit hilfe eines Buch´s und bin beim Kapitel Zeiger/Pointer und irgendwann dachte ich mir.. Hmm es muss doch möglich sein über einen Zeiger auch auf eine Variable eines anderen Programms zuzugreifen. Und das lässt mir jetzt einfach keine ruhe.Liebe grüße und vielen danke, D3luxe
-
So:
int *x; x = 0x0012FD9C;
-
Danke für deine Antwort. Ich habe es versucht leider meldet der Compiler immernoch einen Fehler.
#include<iostream> #include<vector> using namespace std; void Modify(int* x, int wert){ *x=wert; } int main(){ int *x; x=0x0012FD9C; Modify(x, 40); }
Das ist das ganze Programm, also dass, das den Wert im anderen Programm verändern soll. Ich benutze Visual C++. Der Compiler meldet folgendes:
error C2440: '=': 'int' kann nicht in 'int *' konvertiert werden 1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Muss ich den "0x0012FD9C" Wert jetzt noch umwandeln?
-
Du musst noch casten, dann sollte das gehen.
Zu beachten ist aber, dass du sehr wahrscheinlich (abhängig vom OS) kaum direkt auf den Speicher des anderen Programmes zugreifen kannst. Das wäre zu gefährlich.
Üblicherweise hat jedes Programm seinen eigenen Speicher, welcher völlig unabhängig vom Resten ist, ansonsten könnte es sein, dass du wichtige Systemprograme kaputt machst und einen Totalabsturz (oder schlimmer) hast.
Wenn du tatsächlich so auf ein anderes Programm zugreifen willst, dann musst du das mit spezifischen Funktionen machen.
Unter Windows mal seien einmal ein paar Funktionen genannt:- OpenProcess
- VirtualQueryEx
- ReadProcessMemory
- WriteProcessMemory
Alle hier zu finden:
http://msdn.microsoft.com/en-us/library/aa383749(VS.85).aspxAllerdings kein Anfängerthema!
-
hiho
int* pi = (int*)0x123;
mfg dweb
-
Vielen dank an euch beide. Mit dem Code von Dweb hat es funktioniert und wie drakon beschrieben hat konnt ich nicht darauf zugreifen
Unbehandelte Ausnahme bei 0x001613c4 in Test.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x0012fd9c.
Jetzt kann ich wieder ruhig schlafen, jetzt wo ich weiß wie man eine Speicheradresse manuell zuweißt. Ich werde mich später nochmal etwas genauer damit befassen, jetzt kommen aber erstmal die anderen Kapitel dran.
-
oder besser cpp-casts statt c-casts ?!
int* pi = reinterpret_cast<int*>(0x123);
-
Dweb schrieb:
oder besser cpp-casts statt c-casts ?!
int* pi = reinterpret_cast<int*>(0x123);
Generell ja, aber sowas macht man ja eh nicht.
-
Dweb schrieb:
oder besser cpp-casts statt c-casts ?!
int* pi = reinterpret_cast<int*>(0x123);
Ja, immer besser cpp-style-casts.
-
drakon schrieb:
Dweb schrieb:
oder besser cpp-casts statt c-casts ?!
int* pi = reinterpret_cast<int*>(0x123);
Generell ja, aber sowas macht man ja eh nicht.
Manchmal macht man sowas. Bei kleinen Embedded-Geräten, Mikrocontroller, Handhelds und dergleichen sogar ziemlich oft. Generell überall da, wo man nah an der Hardware programmiert.
Aber auch dann ist der Zugriff auf so einen Pointer laut Standard eigentlich undefiniert, wenn er nicht vom Typ
char*
ist.
-
Ich denke der Zugriff ist implementation defined und nicht undefined.
Wichtiger Unterschied.
-
hustbaer schrieb:
Ich denke der Zugriff ist implementation defined und nicht undefined.
Undefined ist richtig. (3.10/15)
-
Nukularfüsiker schrieb:
drakon schrieb:
Dweb schrieb:
oder besser cpp-casts statt c-casts ?!
int* pi = reinterpret_cast<int*>(0x123);
Generell ja, aber sowas macht man ja eh nicht.
Manchmal macht man sowas. Bei kleinen Embedded-Geräten, Mikrocontroller, Handhelds und dergleichen sogar ziemlich oft. Generell überall da, wo man nah an der Hardware programmiert.
Das stimmt. Ein "üblicherweise" hätte da wohl noch hinein sollen.
Aber selbst bei Embeddeg Sachen würde ich sagen, dass es da bessere Sachen, wie explizite Funktionen, gibt, welche einen solchen Zugriff schlussendlich machen. (Ich gehe von "normaler" Software für solche Geräute aus, klar, dass irgendwo genau das gemacht wird, aber in einem Anwendungsprogramm sollte imo sowas nicht vorkommen)