Speicheradresse eingeben und drauf zugreifen.



  • Hi,

    ich beschäftige mich grade etwas mit Zeigern und Referenzen und habe mir folgendes Überlegt.

    Ich bekomm ja von einer Instanz immer eine Adresse auf die ich zugreifen kann.

    Nun meine Frage: Ist es möglich z. B. eine Adresse für eine Variable aus meinem Programm anzugeben (mit cin), anhand dieser Adresse darauf zuzugreifen und den wert zu ändern?

    Ich habe es so probiert:

    #include <iostream>
    
    using namespace std;
    
    int main (void)
    {
        int wert = 123456;
    
        int *zeiger = NULL;
    
        cout << "adresse: " << &wert << endl;
        cout << "wert = " << wert << endl;
    
        cout << "---" << endl;
    
        cout << "bitte adresse eingeben: ";
        cin >> zeiger;                             // << hier gibts probleme :(
        cout << "bitte wert eingeben: ";
        cin >> *zeiger;
    
        cout << "---" << endl;
    
        cout << "adresse: " << &wert << endl;
        cout << "wert = " << wert << endl;
    
        return 0;
    }
    

    doch der compiler sagt mir:

    error C2679: Binärer Operator '>>': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'int *' akzeptiert (oder keine geeignete Konvertierung möglich)	main.cpp	17
    

    ist das in C++ nicht möglich oder gehe ich dafür gerade einen falschen weg?



  • Lies es als int ein und mach einen reinterpret_cast<>. Ist sehr unsauber und unportabel. Gibst du eine ungültige Adresse an kannst du soger dein OS zerschiessen 😉 Nein, das Programm wird dann wohl mit einem Fehler abbrechen, aber man kann sowas nicht genau wissen, da undefiniert.

    Gruß
    Don06



  • Du musst eine Variable vom Typ long (32-Bit System) oder long long (64-Bit System) einlesen und nach (void)* bzw. (int)* casten, da der eingabe Operator für Pointer nicht definiert ist.

    Die Frage ist Allerding, was du vor hast. Ich kann mir kaum vorstellen, dass es einen praktischen nutzen hat, den Benutzer eine Addresse eingeben zu lassen.

    Edit: Zu langsam. int einlesen geht natürlich auch...



  • Prinzipiell ist das möglich. Nur wird man das sicherlich NIE brauchen und man kann es sicherlich auch NIE sicher anwenden.

    Im besten Fall wird die gewünschte Variable angesprochen, im nicht idealen Fall bekommst du eine Zugriffsverletzung (segmentation fault) und im schlimmsten Fall undefiniertes Verhalten.

    Für rein wissenschaftliche Zwecke:

    #include <iostream>
    using namespace std;
    
    int main(int argc, char** args)
    	{
    		int* zeiger;
    		int testobj = 12;
    		unsigned int eingabe;
    
    		cout << zeiger << " : " << *zeiger << endl;
    
    		cout << "Adresse von testobj: " << &testobj << endl;
    		cout << "Bitte Zeigeradresse eingeben: " << flush;
    		cin >> eingabe;
    
    		zeiger = reinterpret_cast<int*>(eingabe);
    
    		*zeiger = 21;
    
    		cout << zeiger << " : " << *zeiger << endl;
    		cout << "testobj: " << testobj << endl;
    
    		return 0;
    	}
    

    Die Entwickler hatten sich schon was dabei gedacht, den operator>> für Zeiger nicht zu definieren.

    Grüße...

    Heiko


Anmelden zum Antworten