2012-02-17 8 views
0

私はポインタと運動でこれを持っている:printf sが(私はHoを得る)証明としてこの逆参照文で何が問題になっていますか?

char *str = "Hello"; 
int count = 0; 
int len = 5; 
printf("%c\n", *(str + count)); 
printf("%c\n", *(str + len - count - 1)); 
*(str + count) = *(str + len - count - 1); 

*(str + count)*(str + len - count - 1)の両方が有効な値です。なぜ私は上記を実行するとbus errorが得られますか?

+1

'str'はどこから来ますか? –

+2

'char'配列のサイズは何ですか?' count'と 'len'の値は何ですか? –

+0

'count'をインクリメントすると、一方の参照が一方向に移動し、もう一方の参照がもう一方の方向に移動します。私はあなたの配列の終わりから、おそらくフロントエンドから歩いていると思います。 –

答えて

3

strは、書き込まれる未定義ビヘイビアであるメモリに常駐する文字列リテラルを指します。多くの場合、コンパイラはこれらの文字列リテラルを書き込み許可を含まないパーミッションでメモリに格納します。これがクラッシュする理由です。これに

変更して:これは、スタック上の配列を作成し、C文字列"Hello"でそれを初期化します

char str[] = "Hello"; 

。スタック上にあるので、自由に変更することができます。

+0

なぜ「バスエラー」ではないのですか?ちょうど*セグメンテーションフォルト*? – kaoD

+0

@kaoD nope、分かりません。文字列リテラルへの書き込みはUndefined Behaviorですが、バスのエラーや大気の爆発など、絶対に何かが起こる可能性があります。 –

+0

それから私は完全に無限のフォーク・アンド・クラッシュループを書いています...そして世界が燃えるのを見てください! ;) – kaoD

関連する問題