Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicherbelegung c++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.12.2017, 16:27 Uhr
ume



Hallo , wie man auf dem Bild unschwer erkennen kann , habe ich mein bestes versucht aber es leider nicht richtig gehabt .
Leider gibt es auch keine Lösung dazu , deswegen wende ich mich an euch.
Hoffe einer versteht die Aufgabe und kann mir eine Lösung evtl präsentieren

Foto:

www.bilder-upload.eu/show.php?file=9d8365-1514042967.jpg

Da man hier glaube ich keine Bilder einfügen kann klickt einfach auf den Link oben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.12.2017, 11:32 Uhr
ao

(Operator)


So, weiter. Die Referenz r_c_arr wird als Alias auf c_arr1[0] genommen und benutzt, um in Adresse 0x1002 ein 'O' unterzubringen. Damit steht in den Adressen 0x1000 bis 0x1003 der Inhalt 'N' 'E' 'O' 'T'.

Als nächstes wird der Int-Pointer p_li deklariert und auf Adresse 0x1010 bis 0x1013 gelegt. Der new-Ausdruck holt Speicher für einen Int und initialisiert ihn mit 0. Der "fiktive Prozessor" nimmt diesen Speicher vermutlich von der nächsten freien Adresse (obwohl kein realer Prozessor auf diesen Gedanken käme), also ab 0x1014. Der Speicherinhalt ist damit:
0x1010 bis 0x1013: 0x00001014
0x1014 bis 0x1017: 0x00000000

Dann kommt die Schleife, läuft von 0 bis 9 (einschließlich, also 10 Durchläufe) und erhöht das Ziel von p_li jedesmal um 1. In 0x1014 bis 0x1017 steht danach 0x0000000A (10 dezimal). Könnte man einfacher haben ...

Die letzten beiden Zeilen (aus A wird B) hast du richtig verstanden. In 0x100C bis 0x100F steht danach also "BAD", und das ist genau das, was diese Übungsaufgabe ist: Ein Musterbeispiel dafür, wie ein Programm nicht aussehen sollte. Total unübersichtlich und mit ein paar gut versteckten Bugs.

Dieser Post wurde am 28.12.2017 um 11:33 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.12.2017, 17:01 Uhr
ume



Haha , ok vielen dank " ao " ,
Leider war das eine Klausuraufgabe ^^... dementsprechend sah sie auch aus . Aber vielen dank das du dir die Zeit genommen hast mir das so gut zu erklären.
Der Prof. eher gesagt ist eben ein Fall für sich...
Da muss man eben durch
Also danke vielmals für die ausführliche Erleuterung nochmal

LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: