Sicherlich unterliegt das alles den Regeln des Compilers, natürlich ist es nicht "read only" im Sinne von ROM.
Man muß sich da damit beschäftigen, welche Speicherbereiche der Compiler für das Programm anlegt:
https://www.geeksforgeeks.org/memory-layout-of-c-program/
Da gibt es insbesondere den "Heap" und den "Stack" (wäre auch mal schön, wenn jemand was dazu erklären würde, ich weiß, daß das wichtig ist, aber nicht, was es genau damit auf sich hat).
Unter "Initialized Data Segment" steht da auch was zu dem Fall 'char *str = "hallo";'. Es mag ja sein, daß man das "string literal" bei manchen Uralt-Compilern zu sagen wir "hello" verändern kann, aber sobald man darüber hinaus schreibt, sagen wir zu "hello world", wird es völlig undefiniert.
In dem Bereich sind ja auch andere "literals" abgelegt, z.B. die 5 aus "int b = 5;". Würde man die z.B. zu 7 verändern, indem man direkt in den Speicher für diese Literals schreibt? Wohl eher nicht. Man würde einfach "b = 7;" machen.
Das sind jedenfalls die Fragen, mit denen man sich bei der C-Programmierung beschäftigen muß, und ich finde, die meisten Tutorials und z.B. auch das Buch von K&R bereiten einen nicht so gut darauf vor.
Z.B. auch, wie bekommt man bessere Fehlermeldungen als nur "Speicherzugriffsfehler". Da gibt es Tools wie das schon genannte "Valgrind", oder auch "gdb" (GNU Debugger von gcc), für den man wahrscheinlich ein Frontend brauchen würde.
http://sourceware.org/gdb/wiki/GDB%20Front%20Ends
Solche Tools gibt es ja - für moderne Compiler, auf dem Amiga könnte es schwierig werden. Nur hatte ich immer Probleme, die auch zu benutzen. Man braucht eben viel Grundwissen, um zu verstehen, was die überhaupt machen, und dieses Grundwissen scheint einem kaum jemand zu vermitteln.
(Man konnte wohl gcc anweisen, Debugginginformationen mit in das Executable zu schreiben, das dadurch größer wurde als sonst. Wenn ich das gemacht hatte, konnte ich mit "kdbg" mein Programm laufen lassen und an beliebiger Stelle anhalten und dann in der GUI von kdbg nachschauen, welche Werte die Variablen in meinem Programm zu der Zeit der Laufzeit hatten. Das wäre schonmal ein Anfang. Aber immer noch sehr unkomfortabel im Vergleich zu den aussagekräftigen Fehlermeldungen von interpretierten Sprachen wie sagen wir Perl. Da weiß man (im Verhältnis) gleich, was los ist, das macht alles sehr viel einfacher.)
Ich hatte sogar mal kurz in ein Fernstudium Informatik reingeschnuppert, und nichtmal da lernte man das. Im ganzen Studiengang gab es keinen C-Kurs (!). Man konnte also ausgebildeter Informatiker (ist ja nicht mehr Diplom - also dann dieses Bachelor / Master) werden, ohne gelehrt zu bekommen, was Heap und Stack sind, und was gdb ist und wie man den benutzt.
Was für mich - neben meinem Alter - auch ein Grund war, da nicht weiter zu machen. Na gut, das führt hier wohl zu weit.
Aber vielleicht lerne ich ja hier im Thema noch was zu diesen Fragen. Wäre schön.