もしかしたら、お互いに誤解があるのかも知れませんので、こちらで激論してください。
さて、私も、屍さんと同じように、文字列リテラルは書き換えてはいけないと思っておりました。
一部のコンパイラ(たとえばBorlandC++)などでは、書き換えてしまいますが、これはコンパイラのバグだと
思っていたわけです。
私のパソコンはWindows7でVisualC++2008ExpressEditionです。
#include <stdio.h>
int main(void)
{
char *str = "Hello!!",*p;
p=str;
*(++p) = 'a';
printf("\n%s",str);
return 0;
}
test.exe の 0x013f13d7 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x013f5741 に書き込み中にアクセス違反が発生しました。
のエラーが実行時に出ます。
Releaseでは、実行時にエラーは出ませんが、Hello!!のままで書き換えられません。
私が理解している考えは
"Hello!!"の部分は静的メモリエリアに用意され、マイコンの場合はROM領域だと思っております。
しかし、先日、Arduinoを勉強していて、実行時にわざわざ、flashメモリからRAMにコピーをしていました。
これは、Arduinoに使われているAVRマイコンが特別なのだと思っています。
論点1
規格で、文字列リテラルが書き換えられるかどうかは、未定義なのか。
論点2
VC++では、私は書き換えられなかったが、書き換えられたという人と、設定が違うのか。
このままでは、気持ちが悪いので、はっきりさせてください。