5

なぜプログラムは、

char *s, *p, c;

s = "abc";

printf(" Element 1 pointed to by S is '%c'\n", *s);
printf(" Element 2 pointed to by S is '%c'\n", *s+1);
printf(" Element 3 pointed to by S is '%c'\n", *s+2);
printf(" Element 4 pointed to by S is '%c'\n", *s+3);
printf(" Element 5 pointed to by S is '%c'\n", s[3]);
printf(" Element 4 pointed to by S is '%c'\n", *s+4);

次の結果を与える?

 Element 1 pointed to by S is 'a'
 Element 2 pointed to by S is 'b'
 Element 3 pointed to by S is 'c'
 Element 4 pointed to by S is 'd'
 Element 5 pointed to by S is ' '
 Element 4 pointed to by S is 'e'

コンパイラはどのようにシーケンスを続行しましたか? そして、なぜs[3]空の値を返すのですか?

4

2 に答える 2

9

シーケンスを続行しません。with valueを与えるため*s+3に最初に逆参照を行ってから、その値に追加しています。に 3 を追加すると、 (少なくとも実行文字セットでは)の値が得られます。schar'a'char'a''d'

などに変更する*(s+1)と、予期される未定義の動作が発生します。

s[3]null 文字である文字列の最後の要素にアクセスします。

于 2013-05-11T14:54:13.217 に答える