Einen konstanten Wert verändern!



  • Ich möchte hier einen kurzen Beitrag, keine Frage bringen.

    Ich habe eine Möglichkeit gefunden, einen konstanten Wert zu verändern.
    Dieser Wert liegt im Heap-Speicher. Testet einfach den folgenden Quelltext.
    Meine Frage dazu: Ist ein NULL-Zeiger ein Zeiger auf den ersten Speicherbereich oder eine Markierung, dass dieser Zeiger auf nichts zeigt?

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	cout << "Ein konstanter Zeiger legt ein Int-Objekt im Heap an." << endl;
    	cout << "Ziel ist es, diesen Wert zu AENDERN!" << endl;
    	cout << "Dazu durchsucht ein nicht-konstanter Zeiger" << endl;
    	cout << "den Speicher nach der Int-Adresse!" << endl << endl;
    
    	const int* pointer = new int(17);
    	int* get = 0;
    
    	int c(0);	// Der Zähler.
    	do
    	{
    		++c;	// Zählen, wie viele Speicherstellen bereits
    				// gesprungen wurde.
    		++get;	// Die Pointer-Adresse suchen und sich
    				// selbst aneignen um den int-Wert zu
    				// verändern.
    		if( get == pointer )
    		{
    			cout << "Adresse gefunden nach " << c << " Schritten!" << endl;
    			cout << "Adresse Original:  " << pointer << endl;
    			cout << "Gefundene Adresse: " << get << endl;
    			cout << "Inhalt des konstanten (!) Zeigers: " << *pointer << endl;
    			cout << "Inhalt veraendern zu: 20" << endl;
    			*get = 20;
    			cout << "Inhalt des konstanten (!) Zeigers: " << *pointer << endl;
    			break;
    		}
    	} while(true);
    	cout << endl << "Der EIGENTLICH konstante Wert wurde veraendert!" << endl;
    
    	cout << endl;
    
    	return 0;
    }
    


  • const werte sind dazu da, um nicht veränderbar zu sein, wenn mans doch tut, is es schlechter ziel(btw: der weg über die speicheraddresse is uns allen bekannt)

    und NULL ist ein define für 0x000000,also ein einfaches 0, somit ist der anfang des speichers damit gemeint.



  • class Hrhr
    {
        public:
            int getsomething () const
            {
                const_cast<Hrhr&>(*this).dosomething();
                return(m_intern);
            }
    
            void dosomething ()
            {
                m_intern = 5;
            }
    
         private:
             int m_intern;
    };
    

    😮

    MfG SideWinder



  • Hmm, also ich hab diesen Weg noch nicht gekannt. Aber ich hab ja auch nicht behauptet, dass ich es wirklich ernsthaft anwenden würde.



  • C++ bietet eben für jeden etwas. 😉 😃



  • zum Casten dazu braucht man kein C++



  • otze schrieb:

    und NULL ist ein define für 0x000000,also ein einfaches 0, somit ist der anfang des speichers damit gemeint.

    Nö. 0 gibt eine ungülte Adresse an. Kann natürlich auch 0 sein, muss aber nicht.



  • const ist nur ein Spachmittel zur Modellierung von Invarianz, aber kein Sicherheitsmechanismus. Der compiler ist nicht verpflichtet, die unveränderbarkeit zu sichern (es ist ihm aber u.U. erlaubt).

    0 ist eine "nirgendwo"-Adresse, die niemals von einem erfolgreichen new oder Adreßoperator auf einen gültigen lvalue zurückgegeben wird. Die C++ - Repräsentation (also im Quelltext) ist immer eine binäre Null, da ist es egal ob man 0 oder das "übliche" NULL (als #define NULL 0) verwendet.

    Die interne Maschinenrepresäntation darf aber davon abweichen. Deswegen muß an den Stellen, wo der compiler nicht weiß daß man einen 0-Zeiger meint, der Typ explizit bekannt gemacht werden (z.B. bei variabler Argumentliste)



  • SideWinder schrieb:

    const_cast<Hrhr&>(*this).dosomething();
    

    😮

    MfG SideWinder

    es hat nichts mit der Frage zu tun :D, aber ich würde für solche Situazionen, die du beschrieben hast, lieber mutable nutzen.



  • Wenn NULL also nicht den ersten Speicherbereich markiert, worauf zeigt dann Nullzeiger++ ? Ist ein Null-Zeiger ein Zeiger auf eine undefinierte Stelle im Speicher und Nullzeiger++ die Stelle danach?



  • Ist (IIRC) "undefiniert", d.h. der Standard sichert dir überhaupt nix zu.

    Wenn Du's trotzdem machst, hängt es natürlich vom Compiler / Plattform ab.

    (z.B. Wintel: NULL zeigt auf eine Adresse die betriebssystemsabhängig auf physischen Speicehr gemappt ist oder auch nicht, un der "NULL++" halt eins weiter)



  • Wohin ein Zeiger+1 zeigt, ist AFAIK generell nicht definiert, es sei denn, Zeiger zeigt in ein Array hinein.


Anmelden zum Antworten