2013-03-29 7 views
6

は読み出し専用メモリに格納され、文字列リテラルは、ポインタを介して変更することができません。これはCONSTチャー*及びチャー*

const char *s = "Hello World!"; 

異なる方法

はまた、* '文字列' のchar *またはconstのchar型のタイプですか?その後、

const char *s = "Hello World!"; 
s[0] = 'X'; // compile error 

あなたがconstを使用しない場合、問題:あなたがしようとした場合、コンパイラはエラーを与えるだろうから、それは、それは難しく、誤ってメモリを上書きすることができconst char *ようなタイプを与えることによって

+0

最初の方法は廃止され、危険です。 – Beta

答えて

6

ランタイムまでキャッチされないかもしれません。あるいは、あなたのプログラムが微妙に間違ってしまうかもしれません。

+0

ああ私はchar *を変更しようとしているのを見て、正常にコンパイルするが、const char *はうまくいきません。したがって、基本的にconstを置くことは、文字列を変更しないように赤いフラグを働かせます。クール! – dharag

8

違いは後者が合法であり、前者が合法でないことです。これはC++ 11で行われた変更です。正式には、"Hello World!"はタイプconst char[13]です。 const char*に変換することができます。昔、そのタイプはchar[13]となり、char*に変換することができました。 C++はconstを追加して配列の型を変更しましたが、char*を使用する既存のCコードがC++で動作するように変換を維持しましたが、ポインタが指すテキストを変更すると未定義の動作が生成されていました。 C++ 11はchar*への変換を取り除きましたので、現在は法的にしかできません

const char *s = "Hello world!"; 
+0

'C++ 11はchar *への変換を削除しました - gcc48ではなく。このgccはバグですか? –

+0

@LeonidVolnitsky - C++ 11では変換が許可されていません。規則は、コンパイラが "診断不要"と言わない制約の違反に対して診断を発行しなければならないということです。だから、必要なのは診断です。これは時には警告です。 –

+0

'const'を追加すると型が変更された場合、' const 'や' const 'は論理的ではないでしょうか? –

関連する問題