Zeiger -Problem, bei zeigerzugriffen



  • hallo mal wieder, ich geh grad ein tutorial durch, und da steht ne aufgabe.
    die probier ich zu lösen, weil der trottel 😉 die lösung nich ins inet gestellt hat, hab ich keine andere möglihkeit mir eine erklärung zu holen...
    also ich hab verstanden, wie es laufen soll, doch mein compiler (dev-c++), bricht immer ab...
    hier der code:

    long *l; 
    l = reinterpret_cast<long*>(0x12345678);
    *l=0x00000001; //hier meldet er einen fehler...
    

    wieso gehts nich???

    thx 😃



  • Also mein Compiler meldet mir hier kein Fehler.... aber beim Ausführen geht es natürlich schief... aber das sollte Dich auch nicht wundern, oder weisst Du gerade auswendig was an der Speicherstelle "0x12345678" steht und ob Du hier überhaupt schreiben darfst?



  • Du legst einen long-Zeiger an, den du auf die Speicheradresse 0x12345678 zeigen lässt.

    Danach willst du dieser Speicheradresse etwas zuweisen. Da schießt dich das Betriebssystem ab:

    - Entweder dir gehört der Speicher nicht
    - oder du zerstört damit ein geschütztes Segment deines Speichers
    - oder anderer Grund

    MfG SideWinder



  • short var1, var2;
    short *ptr1;
    char  *ptr2;
    
    // Zeiger initialisieren 
    ptr1 = &var1;
    ptr2 = reinterpret_cast<char*>(0x0180);
    
    // Daten übertragen
    var1  = 10;
    var2  = *ptr1 * 2;
    *ptr2 = 0xFF;
    

    das ist der code, wie er im tutorial steht, und den erklärungen nach, die übrigen sehr gut waren, und nach langer zeit, wo ich zeiger endlich richtig versteh, dank diesem tutorial,... müsste das aber klappen...
    das tutorial ist in einem unter kapitel, auf www.cpp-tutor.de

    oder, aber die frage war ziemlich unverständlich gestellt, und ich hab sie falsch interpretiert...:

    Definieren Sie einen char-Zeiger und eine long-Variable. Die long-Variable ist mit dem Hex-Wert 0x12345678L zu initialisieren.
    
    Stellen Sie dann die Ausgabe auf Hex um. Zusätzlich soll bei allen nachfolgenden Ausgaben die eingestellte Zahlenbasis mit ausgegeben werden (cout-Flags!).
    
    Geben Sie zunächst den Inhalt der long Variablen aus. Anschließend ist der Inhalt der long Variable in Byte-Darstellung auszugeben, so wie unten angegeben.
    
     Hinweis: Verwenden Sie dazu den char-Zeiger. Die unten stehende Ausgabe gilt nur bei Prozessoren, bei denen das Low-Byte auch auf der niederen Adresse liegt. Bei anderen Prozessoren erhalten Sie eine umgekehrte Ausgabe. 
    
    Zum Schluss ist der char-Zeiger auf die Adresse des String-Literal "ABCD" zu setzen. Der String ist dann mithilfe des char-Zeigers in einzelne Buchstaben zu zerlegen und auszugeben (siehe Programmausgabe unten).
    


  • Du machst nicht das was in der Angabe steht. In der Angabe steht was von char-Zeiger und long-Variable und nichts von long-Zeiger.

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • oh scheisse... bin ich blöd... sry dasss ich euch deswegen genervt hab... 😉

    aber, wieso geht es denn in seinem beispiel?? 😕



  • char *charptr;
    long number = 0x12345678;
    
    // umstellen wie auch immer, habs net ganz gelesen
    
    cout << number << endl;
    
    charptr = reinterpret_cast<char*>(&number);
    for(int i=0; i<sizeof(long); ++i) {
        cout << "Byte #" << i << " -> " << static_cast<int>(*charptr) << endl;
    }
    
    // nun der buchstaben kram, bin net sicher was mit "zerlegen" gemeint ist:
    charptr = "ABCD"; // sollte man eigentlich nur einem const char* zuweisen
    
    for(int i=0; charptr; ++i)
    {
        cout << "Char[" << i << "] = " << *charptr << endl;
    }
    

    Gruß



  • wow..thx lol 😉
    aber wieso muss man bei

    reinterpret_cast<char*>(&number);
    

    den adressoperator for die zu knovertierende variable setzen?? 😕
    👍



  • Du willst den Datenbereich unter der Variable als char[] interpretieren, also benötigst du dessen Adresse, um deinen Ponter dorthin umzuleiten.


Anmelden zum Antworten