char *s = "abc";
と初期化した場合は
s[1] = '\0';
のようなことをすると Segmentation fault になったが、
char s[] = "abc";
の場合は
s[1] = '\0';
が問題なくできた。その後 puts(s) をすると a だけが出た。
OS は Linux でコンパイラは gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) だ。
-S でアセンブラの出力をさせるとどちらも "abc" をリードオンリーの領域に配置させているが
char s[] と書いた場合は関数の初めでスタックに領域を確保してそこにコピーしてからアクセスしていた。
char *s の方は単に先頭アドレスを使うようになるだけ。(そしてリードオンリーの領域に書いて死亡)。

man gcc を見ると -traditional や -fwritable-strings で文字列リテラルに書き込めるようにできるとは
書いてあるが、この man page 自体が古く、4.8.5 では既にこのオプションは使えなくなっていた。