001
28.12.2017, 01:18 Uhr
ao
(Operator)
|
Du meine Güte, was für eine beknackte Aufgabe. Das ist doch gerade der Zweck der Hochsprachen-Programmierung, dass man sich über Speicherinhalte eben nicht den Kopf zerbrechen muss. Wer sind die armen Geschöpfe, die sich mit sowas Überflüssigem rumschlagen müssen?
Liebe(r) ume, lass dir eins versichern: Wer in einem "richtigen" Softwareteam mit solchen Programmen ankommt, der wird sofort geblitzdingst, damit er den ganzen Blödsinn vergisst, den er bisher für "Programmieren" gehalten hat. Es ist eine Frechheit vom Dozenten, eure Zeit mit sowas zu verplempern.
Aber seis drum. Es ist relativ klar, dass auf der Adresse 0x1000 die char-Variable c1 zu liegen kommt. Der Inhalt der Variablen ist 'N'.
c2 ist eine Referenz auf c1, die belegt nach gängiger Konvention überhaupt keinen Speicher. Stattdessen "merkt" sich der Compiler, dass immer wenn c2 geschrieben wird, in Wahrheit c1 gemeint ist, und ersetzt das intern.
Die dritte Codezeile deklariert ein Array von 2 chars, und du hast rote Häkchen dafür bekommen, dass du das auf 0x1002 und 0x1003 gelegt hast. 0x1001 bleibt unbenutzt, würde ich daraus schließen. Der Inhalt beider Adressen des Arrays ist bisher undefiniert.
Die vierte Zeile definiert einen char-Pointer namens p_c, und aus den roten Notizen schließe ich, dass er die Adressen 0x1004 bis 0x1007 belegt. p_c zeigt auf das zweite Element des Arrays c_arr1, der Inhalt der Adressen 0x1004 bis 0x1007 ist also 0x00001003. In welcher Reihenfolge (big oder little endian), das legt die Aufgabenstellung leider nicht fest.
In der fünften Zeile wird über diesen Pointer ein Schreibzugriff gemacht, in die Adresse 0x1003 wird also 'T' eingetragen.
In der sechsten Zeile wirds haarig: Es wird die Adresse von c2 genommen, die ist (siehe oben) identisch mit der Adresse von c1, also 0x1000. Dieser Wert wird um 1 erhöht (0x1001), als char-Pointer dereferenziert und mit 'E' beschrieben. In der Speicherzelle 0x1001 landet also der Wert 'E'.
Diese Zeile stellt einen Buffer Overrun dar, einen schweren Programmierfehler, weil, ausgehend von der Adresse von c1, über den Speicher, der zu c1 gehört, hinaus geschrieben wird. Der Speicher, der dort liegt, gehört niemandem, und eigentlich müsste die Memory-Protection an dieser Stelle eingreifen und den offensichtlich wildgewordenen Prozess abschießen.
Aber weiter, von 0x1008 bis 0x100B liegt int i, und der Wert ist p_c (also 0x00001003) plus 2, d.h. 0x00001005. Was das soll, bleibt rätselhaft. Den Wert eines Pointers (d.h. eine Speicheradresse) in einem Int zu speichern und arithmetisch zu verarbeiten ist in realen Programmen fragwürdig und entspringt fast immer einem Verständnis- oder Schreibfehler. Ich finds schon ziemlich heftig, dass euch das hier so kommentarlos untergejubelt wird.
In der nächsten Zeile wird p_c (gespeichert in 0x1004 bis 0x1007) um 1 inkrementiert und enthält damit 0x00001004. Eine nutzlose Aktion, da dieser Pointer anschließend für nichts benutzt wird.
Von 0x100C bis 0x100F wird "AAD" und ein Nullzeichen (String-Terminator) eingetragen.
Und damit reichts mir für heute nacht. Rest später. Dieser Post wurde am 28.12.2017 um 11:18 Uhr von ao editiert. |