Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@commy

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

More than 3 years have passed since last update.

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

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

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
commy
エンジニャア。 ( icon >> http://mebuika.kenkenpa.net/index.html )

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?