1

この関数を考えてみましょう:

void useless() {
   char data[] = "aaa";
}

ここで学んだことから、"aaa"リテラルはプログラムの最後まで生き続けます。ただし、data[](リテラルで初期化された)はローカルであるため、関数の最後までしか存続しません。

メモリがコピーされるので、プログラムはリテラルに 4B、リテラルへのポインタとリテラルのポインタに 4Bバイトを必要dataとします - これは本当ですか?sizeof(size_t)datasizeof(size_t)

リテラルに静的な保存期間がある場合、2 番目の呼び出しによってローカル リテラルに新しいメモリが割り当てられない - これは本当ですか?

4

2 に答える 2

2
   char data[] = "aaa";

これは文字列リテラルではなく、単なる配列です。したがって、そこにはポインタがなく、メモリはにのみ割り当てられdataます。

リテラルに静的ストレージ期間がある場合、2回目の呼び出しでローカルリテラルに新しいメモリが割り当てられることはありません。

これは、次のような文字列リテラルに当てはまります。char *s="aaa";標準から:

2.13。Sttringリテラル
[...]通常の文字列リテラルのタイプは「arrayofnconst char」で、静的ストレージ期間(3.7)です。

于 2012-09-08T08:47:59.157 に答える
1

ここにはポインタ変数はありません。すべてが4バイトの配列です。

コンパイラは、リテラル自体をメモリに格納する場合と格納しない場合があります。もしそうなら、それはさらに4バイトです。
アレイ自体以外で使用されるメモリは、実装に依存することに注意してください。

「2回目の呼び出し」の意味はわかりませんが、一般に配列を作成すると、ある程度のサイズが必要になります。したがって、同じリテラルで2つの配列を作成すると、コンパイラは次のスペースを割り当てます。 2つの配列(そしておそらく-またはおそらくそうではない-リテラルの場合も)。

于 2012-09-08T08:43:56.140 に答える