Zeigerarithmetik, Zeiger erhöhen, Speicher verändern
-
Hi Leute, ich bin neue hier und habe noch nicht viel Erfahrung mit C und hätte eine Frage zu folgendem Programm:
#include <stdio.h> main() { int i = -1; // Definition einer signed int Variable i int *p = &i; // Zeiger auf i int j; for (j = 0; j < 10; ++j, ++p) { // Zeiger p wird 10 mal inkrementiert printf("An Stelle %p steht %p\n", p, *p); *p = i; printf("An Stelle %p steht jetzt %p\n\n", p, *p); } return 0; }
Wie wird hier der Zeiger jeweils erhöht? Ich habe feststellt, dass er jeweils um 4 Schritte erhöht wird. Aber was bedeutet das?
Und was geschieht bei
*p = i;
Was ändert sich im Speicher?
Das Programm sollte einen längeren zusammenhängen Bereich im Speicher mit Einsen zu belegen. Ist mein Ansatz richtig?
-
Ich habe feststellt, dass er jeweils um 4 Schritte erhöht wird. Aber was bedeutet das?
Das bedeutet, daß auf dieser Maschine ein
int
4 Bytes groß ist.
Deshalb muß die Adresse (die die Maschine üblicherweise in Bytes annimmt), um 4 erhöht werden, um zum nächsten Ort zu kommen, an den einint
passt. Siehesizeof
.Problematisch ist die Frage, ob die Maschine mit dem Speicher, der nach
i
kommt, nicht was anderes vorhat (wovon du ausgehen solltest). Deshalb mußt du befürchten, daß dir bei der Ausführung Dämonen aus der Nase fliegen (oder sonstwas). Jedenfalls schreibst du an eine Stelle, an der es die Maschine nicht erwarten kann. Das ist ganz schlecht.Das Programm sollte einen längeren zusammenhängen Bereich im Speicher mit Einsen zu belegen. Ist mein Ansatz richtig?
Das hängt davon ab, wie die Maschine negative Zahlen speichert. In der üblichen Komplementärabbildung ist -1, wie du richtig sagst, ein Bereich mit lauter 1-Bits. Ich bin mir aber nicht sicher, ob das der Standard vorschreibt (und gerade zu faul, um nachzuschlagen). Allgemein gibt es für solche Fälle man: memset, falls es dir darum geht.
Was ändert sich im Speicher?
Da wird -1 an eine Stelle geschrieben, über die ich (außer beim ersten Durchlauf) keine Aussage machen kann.
Am Rande bemerkt: dein Code sieht ziemlich angestaubt aus, seit man C-Programme so geschrieben hat, ist schon einige Zeit vergangen.
Schau im Zweifel mal hier:
http://de.wikipedia.org/wiki/C99
-
Danke für die Antworten und für die Links. Also ich fange grade erst an C zu lernen. Die meisten C-Compiler unterstürzen den neueren C99 Standard nicht oder nicht ganz, und die Handbücher die ich bis jetzt gefunden haben, beschrieben alle ANSI C (C89).
Als ich versucht habe, die Variable j im Kopf der for-Schleife zu definieren, gab es eine Warnung vom Compiler. Der Zeilenkommentar (beginnen mit //) ist nicht ANSI C konform. Ich steige grade um von Java.Problematisch ist die Frage, ob die Maschine mit dem Speicher, der nach i kommt, nicht was anderes vorhat (wovon du ausgehen solltest). Deshalb mußt du befürchten, daß dir bei der Ausführung Dämonen aus der Nase fliegen (oder sonstwas). Jedenfalls schreibst du an eine Stelle, an der es die Maschine nicht erwarten kann. Das ist ganz schlecht.
Das ist mir auch schon aufgefallen, das Programm wird mit einem Fehler beendet.
Mein Ziel ist es, den Speicher eines Spiels auszulesen und dann zu verändern. Ich weiß nicht ob ich damit auf dem richtigen Weg bin, aber versuchen muss man es ja erstmal.
-
Welcher Compiler?
-
der code sollte eigentlich bös segfaulten, du schreibst in undefinierten speicher
-
bgdnoy schrieb:
Welcher Compiler?
GNU C Compiler (Mingw32)
Wie kann ich den Speicher eines Prozesses nach einem bestimmten Wert durchsuchen? Ich möchte kein Library benutzen, weil ich C erstmal lernen möchte.
-
GNU C Compiler (Mingw32)
Aufrufen mit
-std=c99
. Der gcc ist noch einer der braveren, wenn's um C99 geht. Manchmal macht das Fehlermeldungen verständlicher.Abgesehen davon, daß aus
main
wirdint main
ändert sich an fast allen Lernbeispielen nichts. Es gehen dann aber ein paar Dinge eher wie in Java.Wie kann ich den Speicher eines Prozesses nach einem bestimmten Wert durchsuchen?
Einen Zeiger auf die gewünschte Stelle hernehmen. Solange erhöhen, bis gefunden oder der Bereich zu Ende. Freilich wirst du im Normalfall nicht wissen, wo der Prozess den Speicher hat, den du gerade suchst; oder ob dir dein Windows überhaupt erlauben wird, von dort zu lesen.
Ich möchte kein Library benutzen
Dann wird's schwierig. Windows hat eine Funktion ReadProcessMemory, die das Lesen vielleicht kann -- hab's nie versucht.
Mein Ziel ist es, den Speicher eines Spiels auszulesen und dann zu verändern. Ich weiß nicht ob ich damit auf dem richtigen Weg bin, aber versuchen muss man es ja erstmal.
Es gibt sicher irgendwelche 7331 hax0r t00lz mit denen das grafisch recht einfach geht (man muß sie nur finden).
Aber C lernen hat noch keinem geschadet.