Was wird hier kompiliert?
-
Hallo,
gestellt ist folgende Frage:
Wird folgende Zeile kompiliert? Was passiert?
*((char *) 0x323252) = 10;
Was ich habe: eine Hexadezimalzahl wird zu einem Char Pointer gecastet.Dereferenziert und mit 10 initialisiert?
Kompiliert wird sie. Zumindest in Eclipse mit MinGW.
-
@xcode sagte in Was wird hier kompiliert?:
eine Hexadezimalzahl wird zu einem Char Pointer gecastet, dereferenziert und
mit 10 initialisiert10 zugewiesen?Ja. Und?
-
Kannst du machen.
Solltest du aber nicht machen, wenn du nicht absolut weißt, was du tust und dass die Speicheradresse entsprechend genutzt werden kann.
-
@xcode sagte in Was wird hier kompiliert?:
Wird folgende Zeile kompiliert? Was passiert?
*((char *) 0x323252) = 10;
Kompiliert: Ja. Was passiert: Kann man allgemein nicht sagen, ist implementation-defined. D.h. die Spezifikation der Sprache C gibt vor, dass irgendwas wohldefiniertes passiert, aber nicht was genau passiert. Was genau passiert, muss in der Dokumentation deines Compilers stehen.
In der Regel wird eben einfach deine Zahl als Adresse eines
char
betrachtet und dann diesemchar
der Wert 10 zugewiesen werden. Wenn es sich dabei nicht um eine gültige Adresse gehandelt hat, dann krachts im besten Fall und im schlechtesten Fall passiert nichts direkt und du wunderst dich wochenlang woher der komische Bug in einem komplett anderen Teil des Codes kommt...
-
@dot
Danke für die Antwort.
Kann ich überhaupt auf diesen Pointer zugreifen? Er hat ja keinen Namen und welcher Typ Pointer ist es dann?
-
@xcode sagte in Was wird hier kompiliert?:
Er hat ja keinen Namen und welcher Typ Pointer ist es dann?
Du schreibst den Typ doch selber hin!?
-
@xcode
wenn es vorher nicht geknallt hat klappt‘s vielleicht...std::cout << *((char *) 0x323252);
Ups, C
printf(”%c”, *((char *) 0x323252))
-
@manni66 sagte in Was wird hier kompiliert?:
printf(”%c”, *((char *) 0x323252))
Das Zeichen mit dem Code 10 ist aber (meist) ein Whitespace.
Besser wäre %d
-
Dieser Beitrag wurde gelöscht!
-
Blick das mit den Pointern nicht so ganz durch. Der Code steht für sich allein da, mit der oben genannten Fragestellung.
Wäre folgender Code vergleichbar(nur mit Namen und Typ):char *ptr = (char *) 0x323252; //Ich weise dem Pointer die Adresse 0x323252 zu. *ptr = 10; //In die obere Adresse "lege" ich den Wert 10 rein. printf(”%c”, *ptr);
-
-
Hast du vl. auch einen Tipp, wieso das Programm abstürzt, wenn man es ausführt?
Kompiliert wird es ohne Fehler.
-
@xcode sagte in Was wird hier kompiliert?:
Hast du vl. auch einen Tipp, wieso das Programm abstürzt, wenn man es ausführt?
Weil es Deinem Lieblingsbetriebssystem nicht gefällt, wenn Du einfach so auf zufällige Speicherbereiche zugreifst, die Dir (Deinem Programm) nicht gehören (=nicht im Stack Deines Programms liegen bzw. nicht am Heap von Deinem Programm alloziert wurden).
Nur weil etwas kompiliert heißt das nicht, daß es auch sinnvoller Code ist.