[解決済み] 定義された配列の外側にある最初の要素のデフォルト値が0になるのはなぜですか?
質問
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に初期化されます。
関連
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 配列の最初の要素を取得する
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] Bashでインデックスを指定せずに配列に新しい要素を追加する
-
[解決済み] C# 8の配列スライシング機能による新しいハットオペレーターインデックスは、なぜ0から始まらないのでしょうか?
-
[解決済み】なぜ可変長配列はC++の標準に含まれないのですか?
-
[解決済み] C++ ゼロ初期化 - なぜこのプログラムでは `b` は初期化されないのに `a` は初期化されるのですか?
-
[解決済み] C言語における配列の初期化に関する混乱
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] 未定義、未指定、および実装で定義された動作