Frage zu Code



  • int main()
    {
    
            // das geht nicht
    	char * string = "Hallo";
    
    	string[1] = string[1]; 
    
    	//aber das geht
    
    	int x = 4; 
    
    	x= x;
    
    }
    


  • Ist ja auch undefiniertes Verhalten...



  • dot schrieb:

    Ist ja auch undefiniertes Verhalten...

    Echt? Für mich ist das relativ eindeutig.



  • Der Code versucht, ein const Objekt zu modifizieren...

    Wenn string kein char* sondern ein char[] wäre, würds gehen...



  • Darf man eigentlich lesend über die Arraygrenzen hinweg zugreifen ? Ich leg mir ein array mit 5 Elementen und lese z.B. an Position 10 🙂



  • blurry333 schrieb:

    Darf man eigentlich lesend über die Arraygrenzen hinweg zugreifen ?

    Nein, genaugenommen ist nichtmal garantiert, dass du auch nur eine Adresse, die außerhalb eines Arrays liegt, überhaupt ausrechnen kannst ohne UB. Einzige Ausnahme: Die Adresse die hinter das letzte Element zeigt.



  • dot schrieb:

    blurry333 schrieb:

    Darf man eigentlich lesend über die Arraygrenzen hinweg zugreifen ?

    Nein, genaugenommen ist nichtmal garantiert, dass du auch nur eine Adresse, die außerhalb eines Arrays liegt, überhaupt ausrechnen kannst ohne UB. Einzige Ausnahme: Die Adresse die hinter das letzte Element zeigt.

    Meinst du solche Fälle wie die Adresse 4294967295 (auf 32Bit Systemen)?
    Da wäre die nächste Adresse ja die 0...



  • C++ Standard schrieb:

    If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

    Aber ja, genau das wäre z.B. so ein Fall...



  • dot schrieb:

    Der Code versucht, ein const Objekt zu modifizieren...

    Wenn string kein char* sondern ein char[] wäre, würds gehen...

    Ja, das erste Codefragment, habe nur auf das Zweite geschaut, my bad.

    Skym0sh0 schrieb:

    dot schrieb:

    blurry333 schrieb:

    Darf man eigentlich lesend über die Arraygrenzen hinweg zugreifen ?

    Nein, genaugenommen ist nichtmal garantiert, dass du auch nur eine Adresse, die außerhalb eines Arrays liegt, überhaupt ausrechnen kannst ohne UB. Einzige Ausnahme: Die Adresse die hinter das letzte Element zeigt.

    Meinst du solche Fälle wie die Adresse 4294967295 (auf 32Bit Systemen)?
    Da wäre die nächste Adresse ja die 0...

    Vlt eher soetwas:

    int a; 
    int b;
    auto diff = &b - &a;
    int* pb = &a + diff;
    


  • Ethon schrieb:

    Vlt eher soetwas:

    int a; 
    int b;
    auto diff = &b - &a;
    int* pb = &a + diff;
    

    Ja, das ist auch bereits UB, auch wenn es in der Praxis wohl in der Regel funktionieren wird...



  • Ethon schrieb:

    Vlt eher soetwas:

    int a; 
    int b;
    auto diff = &b - &a;   // <- undefiniertes Verhalten
    int* pb = &a + diff;
    

    Gemeint ist sowas:

    int a[10];
    int *p = &a[10]; // OK, obwohl Index 10 außerhalb von a liegt
    // p = &a[11]; // nicht OK
    

    BTW hätte nicht gedacht, dass so eine einfache Bemerkung auf soviele ratlose Gesichter stößt.


Log in to reply