• ベストアンサー

char *の書き換え

#include <iostream.h> int main(){  char *p = "abcdef";  p[3] = 'g';  cout << p[3];  return 0; } C++です。 p[3] = 'g'; は、やってはいけないことですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

「やってはいけない」というよりは「推奨されない」、「やらない方がよい」、「注意してやるべき」というところでえしょう。 「この程度のプログラム」で「実行環境がパーソナルコンピュータ」であれば(たぶん)問題なく動作するでしょう。 しかし、「もう少し大規模なプログラム」または「パーソナルコンピュータで無い環境」だと不具合を起こす可能性があります。 つまり、プログラムの構成と実行環境に依存します。 char *f1 = "file1.dat" ; char *f2 = "file1,dat" ; f1[4] = '2' ; このとき、f2も"file2.dat"を指す可能性があります。 (つまり、f1とf2が同じ領域を参照する) また、ROMをサポートしたコンパイラでは定数をROMに配置することができるものがあります。 その場合、ROMに配置された定数を書き換えると実行時エラーが起きます。 環境とコンパイラ(最適化)の挙動が把握できていて、定数を書き換えることで発生する状態を「それでよい」とする仕様ならば"やってよい”ことになります。

A__
質問者

お礼

定数がROMに配置された場合は、ポインタを書き換えると エラーが発生するということだったんですね。 ROMというのが何なのか分からないけど、分からないからこそ ポインタの書き換えはしない方がいいということが分かりました。