初歩的なミス
#include <stdio.h> class Ex { public: static const ARY_ELEMENT_NUM = 5; // コンストラクタ Ex() { // 0で初期化 for(int i = 0; i < ARY_ELEMENT_NUM; ++i) { m_Ary1[i] = 0; m_Ary2[i] = 0; } } int m_Ary1[ARY_ELEMENT_NUM]; int m_Ary2[ARY_ELEMENT_NUM]; }; int main() { Ex ex; // m_Ary1は要素数が5つだが8まで代入 for(int i = 0; i < 8; ++i) { ex.m_Ary1[i] = 1; } for(int i = 0; i < ARY_ELEMENT_NUM; ++i) { printf("%d", ex.m_Ary1[i]); //出力: 1, 1, 1, 1, 1 } printf("\n"); for(int i = 0; i < ARY_ELEMENT_NUM; ++i) { printf("%d", ex.m_Ary2[i]); // 出力: 1, 1, 1, 0, 0 } return 0; }
配列外をアクセスしても怒られないですし、
配列外以降のメモリを上書きしています。
メモリが書き換わってすごくわかりづらいバグを生み出してしまいます。
アクセスするときは配列外にアクセスしていないかチェックしましょう。
// 指定したインデックスのm_Ary1の要素を取得 int Ex::GetAry1(int idx) { assert(0 <= idx && idx < ARY_ELEMENT_NUM); // #include <assert.h> return m_Ary1[idx]; } // 指定したインデックスのm_Ary1に要素を設定 void Ex::SetAry1(int idx, int val) { assert(0 <= idx && idx < ARY_ELEMENT_NUM); // #include <assert.h> m_Ary1[idx] = val; }
これで配列外をアクセスしようとしてもassertで止められるのですぐに気づきます。
簡単な処理だからと言って、関数に通さずに直接操作しようとするとハマります・・・。