2012-05-03 4 views
0
char c[]="opop"; 
c[2]='k'; 

しかし、バスエラーが発生するのはなぜですか?文字列が不変の場合、なぜ次のコードがturbo C++で実行されるのですか

+3

あなたが実際に、(あなたがされていない)の前提文字列リテラルを変更した場合でも、「なぜここ未定義の動作の作業を呼び出すありませんの?」欠陥があります。未定義の動作とは、*何かが起こる可能性があることを意味します( "働く"の定義を含む)。 – jamesdlin

+0

私は、タイトルが 'std :: string'が不変であると言っていたと思っていました。もちろん、そうではありません。 –

答えて

7

文字列リテラルではなく、配列です。それは完全に有効なコードです。

char *c="opop"; 
c[2]='k'; 

は未定義の動作と最も可能性の高いクラッシュを引き起こします。

グッド読む:
What is the difference between char a[] = "string"; and char *p = "string";

+1

Turbo C++が古くて、文字列リテラル(char * = "opop"で定義)が下位互換性のために書き込み可能であったというコメントを追加したいと思います。 GCCにはまだこれを可能にする-wwriteable-strings(私が信じる)のフラグがあります。 –

+0

@ std''OrgnlDave:私の古い答えの1つの答えのリンクは、これを標準の引用符で詳しく説明しています。 –

+0

私は8年間C++を使用していません。この不変性は言語の「新しい」特徴ですか?また、私はいつもchar c []とchar * cは同義語だと考えましたか? – Eduardo

関連する問題