2017-04-14 4 views
0

私はいくつかのC++のコードでこれを見つけた:const char *をchar []リテラルの安全と同じに設定していますか?

const char *scaryPointer = "literal"; 

を驚いたことに、これは(少なくとものVisual Studio 2008で)コンパイラの警告やエラーを生成しません。

これは実際には安全ですか?私はchar []リテラルのアドレスは、その行の実行が終了した後は無効であると考えました。

安全な場合は、scaryPointerを新しいリテラルに再割り当てするとどうなりますか?古いリテラルのアドレスは自動的に解放されますか?自動ガベージコレクション?

私はthis questionを見つけましたが、私は質問/回答が私の質問&の懸念に完全には対処していないと思います。

+2

その他:文字列リテラルの型は 'const char [N]'です。非constポインタにリテラルを割り当てる機能は、後方互換性のあるハッキングを省略したものです。 (またはその機能はまだ削除されていますか?) – Hurkyl

+1

@Hurkyl True、しかしそれはここでは起こりません。 – Potatoswatter

答えて

7

文字列リテラルには静的な記憶期間があります。つまり、プログラムが実行されている間は生きています。それらは一般に、プログラムの起動時に読み込まれる読み取り専用のプログラムイメージに格納されます。

2

文字列リテラルには静的な記憶期間があるため、プログラム実行の全期間にわたって存在します。

+1

...私は、あなたが最初のユーザーとほぼ同じ答えを述べたのは偶然ではないと思います。 –

+2

@EvanCarslake私はちょうどいくつかのポイントを獲得するために他の人の答えを盗んでいません。それは偶然だった。 –

+4

@EvanCarslake彼らは両方とも、標準語の狭い語彙から選んだ簡潔な英語の表現を使用したので、偶然の可能性は非常に高いです。 – Potatoswatter

2

const char *notScaryPointer = "literal";は完全に有効です。これは、読み取り専用メモリのcharへのポインタです。後でnotScaryPointer = "some_other_literal";のように再割り当てすることができます。しかし、文字列リテラルに割り当てられたconst char*は読み取り専用メモリに保存されているため、変更することはできません。例えば。このコードスニペットは、おそらくあなたのランタイムエラーを与える:
const char* strPointer = "Hello, world!"; strPointer[0] = 'Y';

あなたは可変文字列をしたい場合は、次にchar Sへのポインタが動作しません。それがあなたが望むなら、charの配列を使用してください。

編集:あなたが最初に尋ねていたものは気付きませんでしたが、他の人が指摘しているように、文字列リテラルは静的な保存期間を持っています。

関連する問題