4
char* const p = "world";
p[2] = 'l';

最初のステートメントは const ポインター p が指す文字列を作成し、2 番目のステートメントは文字列を変更しようとし、コンパイラーによって受け入れられますが、実行時にアクセス違反の例外がポップされ、誰かが理由を説明できますか?

4

5 に答える 5

3

したがって、あなたの質問は2つあります。

  1. アクセス違反が発生する理由: 文字リテラル文字列は、実行可能プログラムの CODE ページにリテラルとして格納されます。最近のほとんどのオペレーティング システムでは、これらのページ (MS ウィンドウを含む) への変更が許可されていないため、保護違反が発生します。

  2. コンパイラがそれを許可するのはなぜですか。このコンテキストの const キーワードは、ポインターが指すものではなく、ポインターを参照します。p="Hello" などのコード。p を定数 (*p ではなく) として宣言しているため、コンパイラ エラーが発生します。それが指すものを定数として宣言したい場合は、宣言を const char *p にする必要があります。

于 2013-09-12T13:46:55.243 に答える
3

の中に

  char* const p = "World";

P は、.rodata メモリ領域に存在する const 文字配列を指します。したがって、p 変数が指すデータを変更することはできず、p を変更して他の文字列を指すようにすることもできません。

于 2013-09-12T13:51:46.760 に答える
-2
char* const p = "world";

ここで、p は定数メモリ アドレスを持つポインタです。したがって、コンパイラごとに構文エラーはなく、値を変更できる定数ポインタとしてランタイム bcoz で例外がスローされるため、これは正常にコンパイルされます。

C++ 参照定数ポインター

定数の正しさ

于 2013-09-12T13:54:02.070 に答える