Marcel F. schrieb:
> OK, Lösung gefunden:
>
> Wenn ich schreibe
>
> dann wird die Variable irgendwo
> im RAM angelegt und kann verändert werden.
Logisch. Genau das hast du ja auch mit dem Array ausgedrückt.
1 | to
|
2 | +---+---+---+---+---+---+
|
3 | | | | | | | |
|
4 | +---+---+---+---+---+---+
|
schreibst du auch noch eine Initialisierung dazu, dann wird der Speicher
auch gleich noch auf definierte Werte gesetzt.
1 | to
|
2 | +---+---+---+---+---+---+
|
3 | | a | b | c | d | \0| |
|
4 | +---+---+---+---+---+---+
|
> Wenn ich aber schreibe
>
1 | > char* to = "yyyyyy";
|
2 | >
|
> dann wird die Variable irgendwo im Flash angelegt
> und kann nicht verändert werden.
Auch logisch.
Die Pointer Variable liegt im SRAM. UNd dieser Pointer wird so
eingerichtet dass er auf ein String-Literal (eine konstanter String)
zeigt. Denn "yyyyy" ist eine Stringkonstante und für dich unveränderbar.
1 | to
|
2 | +-----+
|
3 | | o------------------->"yyyyy"
|
4 | +-----+
|
und da String-Literale per Definition unveränderbar sind, darf sie der
Compiler auch in Speicher legen, der vom Programm aus nicht veränderbar
ist.
Du könntest den Pointer auf was anderes zeigen lassen, wenn du willst
1 | to
|
2 | +-----+
|
3 | | o-------------------->"yyyyy"
|
4 | +-----+
|
5 |
|
6 | "Hallo Du, Copyright by me"
|
1 | to = "Hallo Du, Copyright by me";
|
1 | to
|
2 | +-----+
|
3 | | o---------+ "yyyyy"
|
4 | +-----+ |
|
5 | |
|
6 | +--->"Hallo Du, Copyright by me"
|
aber das ändert nichts daran, dass auch dieses Stringliteral "Hallo Du,
Copyright by me" ein Stringliteral und als solches unveränderbar ist.
Der Compiler darf sogar soweit gehen und mehrere derartige Verweise zu
einem einzigen zusammenführen. Denn wie gesagt: Die String-Konstante ist
für dich ja tabu, kann sich also daher während eines Programmlaufs nicht
verändern.
1 | char* to = "yyyy";
|
2 | char* to2 = "yyyy";
|
1 | to
|
2 | +-----+
|
3 | | o------------------->"yyyyy"
|
4 | +-----+ ^
|
5 | |
|
6 | |
|
7 | to2 |
|
8 | +-----+ |
|
9 | | o---------------------+
|
10 | +-----+
|