(文字列) リテラルのスコープ

このコードは、すべてのプラットフォームで問題ありません。文字列は、静的文字列リテラルとしてバイナリにコンパイルされます。たとえば、Windows を使用している場合は、メモ帳で .exe を開いて文字列自体を検索することもできます。

静的文字列リテラルであるため、スコープは関係ありません。

文字列プーリング:

注意すべきことの 1 つは、場合によっては、同一の文字列リテラルを「プール」して、実行可能ファイルのスペースを節約できることです。この場合、同じだった各文字列リテラルは、同じメモリ アドレスを持つことができます。ただし、そうなるかどうかは決して想定しないでください。

ほとんどのコンパイラでは、リテラルの攪拌に静的文字列プーリングを使用するかどうかを設定できます。

文字列リテラルの最大サイズ:

いくつかのコンパイラには、文字列リテラルの最大サイズがあります。たとえば、VC++ の場合、これは約 2,048 バイトです。

文字列リテラルを変更すると、未定義の動作が発生します:

文字列リテラルの変更は絶対に行わないでください。未定義の動作があります。

char * sz = "this is a test";
sz[0] = 'T'; //<--- undefined results

ワイド文字列リテラル:

上記のすべては、ワイド文字列リテラルにも同様に適用されます。

例:L"これはワイド文字列リテラルです";

C++ 標準の状態: (セクション lex.string)


あなたの混乱がいくらか明確になるように、例を挙げます

char *f()
{
char a[]="SUMIT";
return a;
}

これはうまくいきません。

しかし

char *f()
{
char *a="SUMIT";
return a;
}

これは機能します。

理由:"SUMIT" グローバルスコープを持つリテラルです。一方、配列は単なる文字列 {'S','U','M','I',"T''\0'} です スコープが限られており、プログラムが返されるとすぐに消えます。


他の人が説明したように、これは C (または C++) で有効です。

私が気をつけなければならないことの 1 つは、DLL を使用している場合、このコードを含む DLL がアンロードされるとポインタが有効なままにならないということです。

C (または C++) 標準は、実行時のコードのロードとアンロードを理解していないか、考慮していません。呼び出しコードの POV から、プログラムの全期間にわたって保持されないように見えます。