2

間に

int array[100][100];

int array[100][100]={0};

最初のものでは、配列のすべての要素を印刷すると、94行目以降の途中で、ガベージ値を取得し始めますが、それより前のすべての値は0ですが、2番目のものではすべての値が0です.

最初の宣言もデフォルトの 0 値で初期化しませんか? そうでない場合、配列内のすべての値がガベージではなく、94 行目以降にのみガベージ値が表示されるのはなぜですか?

4

6 に答える 6

1

int配列[100][100];

  if this declaration is in the scope of main i.e in Stack Segment then

この配列のメモリはスタックに割り当てられます。誰もこのスタックを使用していない場合、値ゼロを取得する可能性があると考えてください。

 if same declaration is in Global, then all the array elements will be

ゼロにインストール。

int 配列[100][100]={0};

 Irrespective of any segments [Stack/Data(Global,Static)] if any one 

変数が配列で初期化された場合、残りの配列要素はゼロに初期化されます。

于 2013-03-20T11:30:51.520 に答える
1

最初のスタイルでは、変数がグローバルである場合にのみ、データが 0 に初期化されます。明示的な初期化を欠くローカル変数は、スペースが変数に割り当てられたときに格納場所にあったものと同じになります。

于 2013-03-20T11:12:53.420 に答える
1

最初の宣言もデフォルト値 0 で初期化しませんか?

いいえ。これがローカル スコープの変数であると仮定すると、最初の宣言では初期化はまったく行われません。

配列内のすべての値がガベージであるとは限らず、94行目以降にのみガベージ値が表示されるのはなぜですか?

0初期化されていないメモリは、観察している値を含め、任意の値を持つことができます。

于 2013-03-20T11:12:12.053 に答える
1

最初の宣言は初期化を保証しません。実際、何も実行しないと思います。

94番目の要素までメモリがクリアされているという事実は、OSがクリーン/まだ未使用のメモリを提供したためです。

クリアなメモリを確保したい場合は、2 番目の宣言を使用する必要があります。

于 2013-03-20T11:14:11.050 に答える
1

最初のステートメントには明示的な初期化はありません。配列がグローバル スコープで宣言されている場合、暗黙的な初期化が可能です。

「半分初期化されているように見える」の理由は、ユーザー空間プログラムは通常、セキュリティ上の理由 (パスワードなどを含む他のプロセスからのデータにアクセスしない) のためにスタック/ヒープをゼロにして開始するためですが、ローカル変数が常にクリアされるという保証はありません。 . パフォーマンス上の理由によるものではないという保証があります。C でも、main が呼び出される前に多くのアクティビティが発生する可能性があります。crt0 はランタイムを初期化し、静的データを read_only セクションからグローバル変数にコピーします。その結果、多くのプログラムのヒープとスタックが損なわれます。

于 2013-03-20T11:15:52.753 に答える
0

まず、クリーンで率直な質問に対して+1します。答えは、明示的に初期化されていない場合、ローカル変数は暗黙的に初期化されません。0 を含み、他のガベージ値を含まない 93 個のメンバーすべては、定義済みの動作ではありません。上記のコードを複数回実行して試すと、最初の宣言に対して異なるガベージ値が返されることがわかります。理解を深めるために、上記のコードのアセンブリ レベルに進み、内部で何が起こっているかを確認してください。

于 2013-03-20T11:25:31.697 に答える