1. ホーム
  2. c++

[解決済み] 定義された配列の外側にある最初の要素のデフォルト値が0になるのはなぜですか?

2023-02-28 03:27:58

質問

C++入門のクラスの期末試験に向けて勉強しています。 教授が練習用にこの問題を出してくれました。

コードが以下の出力を生成する理由を説明しなさい。 120 200 16 0

using namespace std;
int main()
{
  int x[] = {120, 200, 16};
  for (int i = 0; i < 4; i++)
    cout << x[i] << " ";
}

問題の解答例は

cout文は、forループのインクリメントによって添え字が定義されている配列の要素を単に循環させているだけです。要素のサイズは、配列の初期化によって定義されるものではありません。 forループが配列のサイズを定義しており、それがたまたま初期化された要素数を超えているため、最後の要素のデフォルトが0になっています。 最初のforループは要素0(120)を表示し、2番目のループは要素1(200)を表示、3番目のループは要素2(16)を表示、4番目のループは要素3が何も初期化されていないので配列のデフォルト値である0を表示しています。この時点でiは条件を超えたので、forループは終了します。

なぜ配列の外側の最後の要素が常に "defaults"ゼロになるのか、少し混乱しています。 実験として、問題のコードを IDE に貼り付けましたが、for ループを次のように変更しました。 for (int i = 0; i < 8; i++) . その結果、出力は 120 200 16 0 4196320 0 547306487 32655 . 定義されたサイズから外れた配列の要素にアクセスしようとしても、なぜエラーが発生しないのでしょうか? プログラムは、前回そのメモリ アドレスに値が保存されたときの残りデータを出力するだけなのでしょうか?

どのように解決するのですか?

なぜ配列の外側の最後の要素が は常に 0 になります。

この宣言では

int x[] = {120, 200, 16};

配列 x はちょうど3つの要素を持っています。そのため、配列の境界外のメモリにアクセスすると、未定義の動作が発生します。

つまり、このループは

 for (int i = 0; i < 4; i++)
 cout << x[i] << " ";

は未定義の動作を引き起こします。配列の最後の要素の後のメモリには何でも入れることができます。

一方、もし配列が

int x[4] = {120, 200, 16};

つまり、4つの要素を持つ場合、明示的な初期化子を持たない配列の最後の要素は、確かに0に初期化されます。