Dein ganzes Programm hat undefiniertes Verhalten.
Ein String-Literal (also ein konstanter Text, wie zb "Hello") ist
unveränderlich! Du darfst gar nicht versuchen, ihn zu ändern.
1 | char *Text; /* Zeiger vom Typ char */
|
hierdurch hast du einen Zeiger eingerichtet
jetzt lässt du diesen Zeiger auf einen konstanten Text zeigen
und jetzt versuchst du, über den Zeiger den konstanten Text zu
verändern. Und das darfst du nicht.
Das geht zwar in C nicht, weil ein Integer-Literal (anders als ein
String) keine Adresse besitzt. Aber im Grunde, analogiemässig gesehen,
versuchst du jetzt gerade dieses hier zu machen
1 | int * p;
|
2 | p = &78;
|
3 |
|
4 | *p = 5;
|
Deine Variante 3 hingegen, macht etwas ganz anderes. Sie setzt den
Zeiger um. Der zeigt nicht mehr auf den konstante Text "Hello" sondern
auf den ebenfalls konstanten Text "Bello"
vorher:
1 | Text
|
2 | +--------+
|
3 | | o-------------------------->"Hello"
|
4 | +--------+
|
5 | "Bello"
|
nachher
1 | Text
|
2 | +--------+
|
3 | | o--------------+ "Hello"
|
4 | +--------+ |
|
5 | +-->"Bello"
|