1

次のコードでは、スタックに配列が作成されているだけなのか、静的に配列が作成されているのか疑問に思いました。文字列からの配列の作成とちょっと混乱しています。

char str[] = "White";

"White\0"これにより、静的メモリ内の次の内容の配列を指すstrという名前のスタックにポインタが作成されると想定しています。これは仮定として正しいですか?

4

2 に答える 2

8

いいえ。

"White"char[6]どこかの静的メモリ内の配列です。(または魔法の土地、それは指定されておらず、完全に無関係です)。"White"コード内の他の場所と同じ静的配列である場合とそうでない場合があることに注意してください。

char str[] = "White";char[6]スタック上に、という名前の新しいローカル配列を作成し、静的配列からローカル配列に文字strコピーします。関係するポインタはまったくありません。

これは、配列をコピーできる唯一のケースであることに注意してください。ほとんどの場合、アレイはこのようにコピーされません。

魔法の静的配列へのポインタが必要な場合は、単にconst char* str = "White";

Phonetaggerは、コード行が関数内にない場合str、スタック上ではなく、魔法の静的メモリ内にもあるが、コピーは(理論的には少なくとも)その変換ユニットでコードの実行が開始される直前に行われることに注意してください。

于 2012-12-13T22:18:20.723 に答える
4

間違い。あなたが説明したことは、あなたが書いたときに何が起こるかです:

const char * str = "White";

その代わり、

char str[] = "White";

スタック上に配列(その文字列を保持するのに十分な大きさ)を作成し、そのテキストで初期化します。「通常の」文字列リテラルとchar配列の初期化構文は無関係です。

(実装に関しては、多くの場合、コンパイラは次のようなコードを出力します

char str[SIZE_OF_THE_STRING];
strcpy(str, "White");

しかし、それは実装固有の詳細です)

于 2012-12-13T22:16:31.043 に答える