質問: i; } for(i=0;i<=N;i++){ std::cout << i <<' '<< a[i] << '\n'; } std::cout << '\n'; } ``` そして結果が以下のように出力されました。 0 0 1 1 2 2 3 3 4 4 5 5 *** stack smashing detected ***: ./a.out terminated 中止 (コアダンプ) このaには出力の結果から{0,1,2,3,4,5}が入っているようですが、 しかしaの要素数は5ですからaに5が入るのはおかしいような気がします。 入るのがおかしい値が、aに入っている理由について教えていただけましたら 幸いです。また中止(コアダンプ)が出てしまう理由も伺いたいです。 よろしくお願いいたします。
回答: 配列の要素数`N`が5なのに`for (i=0;i<=N;i++)`でループを回しているので、`i`は、0,1,2,3,4,5と6通りの値をとります。(今回の場合、値が出力されるところまでは動いているので、すでに気づかれている通りですが。) 6番目(インデックスが5)は割り当てられた領域の外ですから、その結果は未定義ですが、クラッシュしてコアダンプを吐くというのは十分あり得る動作です。 **C/C++の配列操作ではその辺のチェックはやってくれない**ので、見た目6番目の値が書き込めているように見えることはあります。 **割り当てられた領域の外と言ってもコンピュータのメモリ内のどこか**ですから、書き込みができてしまうことも読み出せてしまうことも珍しくはありませんが、そのメモリは他の用途に使われているので、領域外の書き換えを行うと、その影響が後から現れるのもよくある動作です。 「他の用途」がその部分を読み出した時に初めてその影響が出るわけです。例えば、その部分が何かのアドレスとして使用されていたとすると、書き換えによってとんでもないアドレスをさすことになり、そのせいでコアダンプに結びつくようなCPU例外が発生したりするのです。