16
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

#C よく見る"Bus error: 10"の原因追求

Last updated at Posted at 2016-05-06

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

これでうまくいきました。
原因は文字列リテラルとコンパイラの関係みたいで、

  • ポインタ変数に文字列リテラルを直接設定すると、変更(上書き)ができない
  • 配列にすると自由に書き換え可能
    とのことです。配列に直接設定するのとポインタに直接設定するのではメモリに対して扱いが変わると。このことに関しての詳細はまた時間があれば。
16
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?