30

次のコードを検討してください。

const char* someFun() {
    // ... some stuff
    return "Some text!!"
}

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}

functionsomeFun()では、 が"Some text!!"格納されている場所 (ROM の静的領域にある可能性があると思います) とその内容範囲一生?

が指すメモリはretStr、プログラム全体で占有されますか、それともブロック A が終了すると解放されますか?

4

4 に答える 4

47

C++ 標準では、文字列リテラルを格納する場所は規定されていません。ただし、それらの存続期間がプログラムの存続期間であることは保証されます。したがって、コードは有効です。

于 2010-04-05T17:37:35.843 に答える
32

にはスコープ"Some text!!"がありません。スコープは、指定されたエンティティのプロパティです。より正確には、それは名前自体のプロパティです。名前のないオブジェクト-文字列リテラルです。名前がないため、その「範囲」についての議論はまったく意味がありません。スコープはありません。"Some text!!"

あなたが質問しているように見えるのはスコープではありません。の存続期間または保存期間です"Some text!!"。C / C ++の文字列リテラルには静的な保存期間があります。つまり、プログラムが実行されている限り、文字列リテラルは「永久に」存続します。したがって、占有されているメモリが"Some text!!"解放されることはありません。

文字列リテラルは変更できないオブジェクトであることに注意してください(補足として)。そのメモリに書き込むことは違法です。

于 2010-04-05T17:47:48.067 に答える
5

文字列は、プログラム バイナリの特別な (通常、最新の OS では読み取り専用) セクションに静的に格納されます。そのメモリは割り当てられず (文字列に対して個別に、メモリにロードするときのセクション全体に対してのみ)、割り当て解除されません。

于 2010-04-05T17:36:47.533 に答える
-3

retStrが指すメモリは、プログラム全体で占有されますか、それともブロックAが終了すると解放されますか?

編集:

リリースされませretStrが、利用できなくなります。(ブロックスコープ)

const char *ptr;
{   
   const char* retStr = "Scope";
   ptr = retStr;
}   

printf("%s\n", ptr); //prints "Scope"

//printf("%s\n", retStr); //will throw error "retStr undeclared"
于 2010-04-05T17:57:37.517 に答える