次のように C 文字列を返す単純な関数があるとします。
const char * getString()
{
const char * ptr = "blah blah";
return ptr;
}
そして、次のように main() から getString() を呼び出します。
const char * s = getString();
1) gdb によると、変数ptrはスタックに格納されますが、ptr が指す文字列はそうではありません。
(gdb) p &ptr
$1 = (const char **) 0x7fffffffe688
(gdb) p ptr
$2 = 0x4009fc "blah blah"
これは、「何とか」が getString() 内のローカル変数ではないということですか?
それがローカル変数である場合、それを main() 関数に渡すことができないと思います...しかし、そうでない場合、どこに保存されていますか? ヒープ上?それは、文字列にヒットするたびにOSによって実装される「一種の」動的メモリ割り当てですか、それとも何ですか?
2) ポインターの代わりに配列を使用する場合、次のようにします。
const char *getString2()
{
const char a[] = "blah blah blah";
return a;
}
コンパイラは次のように警告します。
warning: address of local variable ‘a’ returned
(もちろん、プログラムはコンパイルされますが、動作しません)。
実際、gdbに尋ねると、
(gdb) p &a
$2 = (const char (*)[15]) 0x7fffffffe690
しかし、const char * ptrとconst char a[]は基本的に同じものだと思いました。そうではないようです。
私が間違っている?2 つのバージョンの正確な違いは何ですか?
ありがとうございました!