疑問
下記のコードは期待通りに動きます.
c
1char str[] = "abc"; 2str[0] = 'd'; 3printf("%c\n", str[0]);
ですが,同じように見える次のコードはコンパイルは通りますが,動きません.(bus error)
c
1char *str = "abc"; 2str[0] = 'd'; 3printf("%c\n", str[0]);
なぜ1番目のコードが動くのに,2番目のコードはだめなんでしょう?
考えたこと
- 文字列リテラルはcharの配列ですが,式の中ではcharへのポインタに読み替えられます.すなわち'a'へのポインタです.
- ですが,配列初期化時に使われる文字列リテラルに限って,中括弧を用いる初期化の仕方の省略形に読み替えられます.
- よって1番目のコードの文字列リテラルは配列の初期化に使われているので,中括弧のやり方で展開されます.
- 一方2番目のコードの文字列リテラルはポインタの初期化であるのでstrは'a'へのポインタとして解釈されます.
以上より,2番目のコードにおいて,str[0]は*(str+0)にかわり,"dbc"に変わると思ったのですが,どこが違うんでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。