2012-01-25 11 views
0

可能性の重複:const性

const char* str = "hello"; 
:限りあなたが好き宣言を与える必要があり、一定のAC文字列を作りたい場合、私は理解し

Modifying C string constants?

または

char* const str = "hello";  

しかし、のような簡単な宣言:

char* str = "hello" 

私は任意の手段によって文字列を変更しようとした場合 -

str[2] = 'f'; 

または

*(str+2) = 'f'; 

ように私はいつもセグメンテーションを取得しますそれはなぜですか?また

私はのconstポインタを変更するために、警告、エラーやセグメンテーション違反を取得する必要がありますしようとしていますが、私は何もしてコードをコンパイルしないと完全に実行し得るスコットあたりマイヤーズとして

const char* const str = "hello"; 
str = "bye"; 

のような宣言を行った場合。私は困惑しています。私はg ++をubuntu 11.10で使っています。

+0

はい、私も困惑しています。適合するコンパイラは、最後に表示されたコードのスニペットを拒否する必要があります。あなたのものがそうでなければ、それはバグを含んでいます。コンパイラを責める前に、警告を無視していないことを確認してください。 –

+0

*コードは正しくコンパイルされ、実行されます。*文字列リテラルを変更すると、**未定義動作**が発生します。これは、安全なベットがすべてオフになっているか、プログラムが動作していてもかまいません。プログラムは不正な形であり、説明されるかもしれないし、説明されない振る舞いを示すことができる。 –

答えて

3
char* str = "hello"; 

文字列リテラルhelloは読み取り専用の場所にあり、変更できません。コンパイラは、識別子strの初期化に関する警告を出力する必要があります。

が実際に文字列を変更するには、あなたは何をする必要がある -

char str[] = "hello"; // Copying the string literal hello to the array str 

str[2] = 'f'; // Now these are valid. 
str[2] = 'f'; 
4
char* str = "hello" 

これは、暗黙的にchar*に変換する文字列リテラルを許可する非推奨の変換を利用します。この変換を利用しないでください。

strが文字列リテラルを指しているにもかかわらず、文字列リテラルの文字はまだconstです。

const char* const str = "hello"; 
str = "bye"; 

このコードが悪い形成されています。コンパイラはそれを拒否すべきです。

コンパイラがこのコードを拒否しない場合、または少なくとも診断メッセージ(警告)を発行していない場合は、コンパイラのバグか「言語拡張」です。