

お世話になります。

c++の配列についてよくわからない点が出てきました。  
以下のようにコードを書きました。以下のコードで配列にどのような  
値が入っているのかを調べようと思いました。

[code]

    #include<iostream>
    const int N = 5;
    main(){
        int i=0,a[N];
        for (i=0;i<=N;i++){
            a[i] = i;
        }
        for(i=0;i<=N;i++){
            std::cout << i　<<' '<< a[i] << '\n';    
        }
        std::cout << '\n';
    }
    
[/code]

そして結果が以下のように出力されました。  
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に５が入るのはおかしいような気がします。  
入るのがおかしい値が、aに入っている理由について教えていただけましたら  
幸いです。また中止(コアダンプ)が出てしまう理由も伺いたいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2018-10-20T13:56:44.757
49484
2018-10-20T14:17:45.410
30396
question
c++
c++ 配列の要素数に関して


配列の要素数`N`が5なのに`for
(i=0;i<=N;i++)`でループを回しているので、`i`は、0,1,2,3,4,5と6通りの値をとります。(今回の場合、値が出力されるところまでは動いているので、すでに気づかれている通りですが。)

6番目(インデックスが5)は割り当てられた領域の外ですから、その結果は未定義ですが、クラッシュしてコアダンプを吐くというのは十分あり得る動作です。

**C/C++の配列操作ではその辺のチェックはやってくれない** ので、見た目6番目の値が書き込めているように見えることはあります。

**割り当てられた領域の外と言ってもコンピュータのメモリ内のどこか**
ですから、書き込みができてしまうことも読み出せてしまうことも珍しくはありませんが、そのメモリは他の用途に使われているので、領域外の書き換えを行うと、その影響が後から現れるのもよくある動作です。

「他の用途」がその部分を読み出した時に初めてその影響が出るわけです。例えば、その部分が何かのアドレスとして使用されていたとすると、書き換えによってとんでもないアドレスをさすことになり、そのせいでコアダンプに結びつくようなCPU例外が発生したりするのです。


CC BY-SA 4.0
2018-10-20T14:17:45.410
49485
2018-10-20T14:17:45.410
13972
49484
answer