Cでプログラムを書いてコンパイル,実行したときに以下のようなメッセージを吐かれることがしばしば.
$ ./a.out
Bus error: 10
これについて原因を追求してみた。
int main(void)
{
char *str;
str = "ABCDE";
*str = 'X';
printf("%s\n", str);
return 0;
}
これが実際にエラーを吐かれたときに実行したプログラム。文字列リテラル"ABCDE"
の1文字目を'X'に変えたいわけだが、これじゃだめらしい。いろいろと調べた結果、
str = "ABCDE";
どうもこの部分で引っかかっている模様。以下のように配列を使って書き換えてみる。
int main(void)
{
char str[] = "ABCDE";
*str = 'X';
printf("%s\n", str);
return 0;
}
実行結果が以下。
$ ./a.out
XBCDE
これでうまくいきました。
原因は文字列リテラルとコンパイラの関係みたいで、
- ポインタ変数に文字列リテラルを直接設定すると、変更(上書き)ができない
- 配列にすると自由に書き換え可能
とのことです。配列に直接設定するのとポインタに直接設定するのではメモリに対して扱いが変わると。このことに関しての詳細はまた時間があれば。