Pointer-Story I
-
Hallooooo,
Ich experimentiere ein wenig mit Pointer.
Nun bin ich auf folgendes Problem gestoßen:int main(...) { int* ptr = reinterpret_cast<int*>(0x12345); *ptr = 1; }Das ist nicht erlaubt. Aber wieso?
Bitte jetzt nicht beleidigend antworten. Ich versuche das nur zu verstehen.
Ich hoffe ihr könnt mir das erklären.
Lg Bill Gate´s son
-
Das ist gültiges C++, es macht nur keinen Sinn

Ein Pointer beinhaltet sowas wie eine Speicheradrssse einer anderen Variable. Hier weist du ptr die Adresse 0x12345 zu. Und gibst du Anweisung, an diese Adresse einen int zu schreiben. Aber an diese Adresse darfst du nicht schreiben. Moderene (d.h. seit ungefähr 386er Generation) Betriebssysteme sind - aus guten Gründen - recht pingelig, wenn es darum geht, welches Programm wohin schreiben darf. Ein Programm muss beim Betriebssystem eine Anfrage stellen, wenn es speicher braucht und bekommt dann die Adresse eines Speicherblocks zugewiesen. Da du dir einfach nimmst, was dir nicht gehört, wird dein Programm vom System abgeschossen.
-
Bill Gate´s son schrieb:
Das ist nicht erlaubt. Aber wieso?
Weil es undefiniertes Verhalten hervorruft. Du willst dem Zeiger eine willkürliche Adresse zuweisen und den Zeiger danach dereferenzieren. Woher willst du dir so sicher sein, dass sich dahinter gültiger Speicher verbirgt? Das ist nämlich mit grosser Wahrscheinlichkeit nicht der Fall.
Sag lieber, was du erreichen willst, das geht bestimmt auch besser.
-
Huhu,
danke für eure Antworten.
Also:1. Programm (Das Versuchstierchen) - VB.Net
Dim Variable as Integer = 123456 While(True) Console.WriteLine(Variable) Sleep(300) End While2. Programm (Der Wertchanger^^) - C++
int main(...) { int* ptr = reinterpret_cast<int*>(0x12345); *ptr = 1; }Woher willst du dir so sicher sein, dass sich dahinter gültiger Speicher verbirgt?
Ich habe die Adresse mittels Cheat Engine herausbekommen, hab den Wert von 'Variable' ändern können... Nur will ich das mit dem '2.Programm' auch können.
Moderene (d.h. seit ungefähr 386er Generation) Betriebssysteme sind - aus guten Gründen - recht pingelig, wenn es darum geht, welches Programm wohin schreiben darf.
Hört sich logisch an, das heißt ich kann den Wert der Adresse nicht einfach mit Pointern ändern? Brauch ich da was bestimmtes?
Lg Bill Gate´s son
-
Unter Windows mit WriteProcessMemory();
-
Bill Gate´s son schrieb:
Hört sich logisch an, das heißt ich kann den Wert der Adresse nicht einfach mit Pointern ändern? Brauch ich da was bestimmtes?
Das geht über C++ hinaus. Das musst du mit deinem Betriebssystem aushandeln, ob und wie das erlaubt ist.
-
SeppJ schrieb:
Bill Gate´s son schrieb:
Hört sich logisch an, das heißt ich kann den Wert der Adresse nicht einfach mit Pointern ändern? Brauch ich da was bestimmtes?
Das geht über C++ hinaus. Das musst du mit deinem Betriebssystem aushandeln, ob und wie das erlaubt ist.
hmmm, dann muss ich wohl Papa fragen. Der kennt sich damit GANZ GUT aus.
WriteProcessMemory();Werde ich mir mal anschauen. Danke!
Danke euch, werde meinem Vater bescheid sagen, dass er euch paar Scheinchen schicken soll.