30

Cの次のコードが機能するのはなぜですか?

const char* str = NULL;
str = "test";
str = "test2";

strは定数文字へのポインタなので、なぜ異なる文字列リテラルを割り当てることができるのでしょうか。さらに、strが変更されないようにするにはどうすればよいですか?たとえば、後でstrをより長い文字列に割り当てた結果、メモリの別の部分に上書きされた場合、これは問題になる可能性があります。

テストでは、各割り当ての前後にstrのメモリアドレスを出力しましたが、変更されることはありませんでした。したがって、strはconst charへのポインタですが、メモリは実際に変更されています。おそらくこれはCのレガシー問題なのだろうか?

4

6 に答える 6

44

constではないポインターを変更しています(ポインターが指しているのはconstです)。

ポインタ自体をconstにする場合、宣言は次のようになります。

char * const str = "something";

また

char const * const str = "something";  // a const pointer to const char
const char * const str = "something";  //    same thing

非constデータへのconstポインターは、通常、pointer-to-constよりも有用性の低い構成です。

于 2009-01-13T19:13:08.277 に答える
14

さらに、strが変更されないようにするにはどうすればよいですか?

char * const str1; // str1 cannot be modified, but the character pointed to can
const char * str2; // str2 can be modified, but the character pointed to cannot
const char * const str3 // neither str3 nor the character pointed to can be modified.

これを読み取る最も簡単な方法は、変数名から始めて左に読むことです。

  • str1は、文字への定数ポインタです。
  • str2は、文字定数へのポインタです。
  • str3は、文字定数への定数ポインタです

注:右から左への読み取りは一般的なケースでは機能しませんが、単純な宣言の場合は簡単な方法です。「TheCProgrammingLanguage」のコードに基づいたJavaアプレットを見つけました。これは、宣言を解読し、その方法を完全に説明しています。

于 2009-01-13T19:21:28.477 に答える
2

関連するメモとして、「const ポインターと const へのポインター」を必ず確認してください。一部の人々がconst の正確性と呼ぶものに役立ちます。ブックマークに入れておき、時々参照できるようにしています。

于 2009-01-13T22:02:21.743 に答える
1

文字列リテラルのメモリはスタックに割り当てられ、割り当てはすべて、strそれらのメモリアドレスを指すようにポインタを変更するだけです。それが最初に指し示した定数文字はまったく変わっていません。

于 2009-01-13T19:12:01.413 に答える
1

あなたが探しているのは構文かもしれません...

const char* const str = NULL;
str = "test";
str = "test2";

char *の後の「const」に注意してください。これは、コンパイル/ビルドしようとしたときにコンパイラエラーを生成します。

于 2009-01-13T19:18:06.863 に答える
1

さらに、変数を const として宣言するということは、変数が読み取り専用であることを意味します。値が一定という意味ではありません。

于 2009-01-13T19:41:51.323 に答える