-4

C++11 の std::array のアイデアが気に入ったと思っていましたが、クォークが含まれているようです。次のコードでセグメンテーション違反が発生するため、これを見つけました。

#include<array>
#include<iostream>

int main() {
        std::array<std::array<int*, 5>, 4> sum;

        //Initialize sum array
        std::cout << sum.size() << " " << sum[0].size() << "\n";
        for (size_t i = 0; i < sum.size(); i++) {
                for (size_t j = 0; j < sum[0].size(); j++) {
                        if (i == 0 || j == 0)
                                *(sum[i][j]) = 0;
                        else
                                sum[i][j] = nullptr;
                }
        }

    return 0;
}

これは以下を出力します:

4 5
Segmentation fault (core dumped)

sum.size()予想通り 4 をsum[0].size()返し5、予想通り を返します。IE では、4 行 5 列の配列があるようです。ただし、このプログラムを実行しようとすると、セグメンテーション違反が発生します (上記のように)。このリンクは、配列にアクセスする方法の順序を逆にすること(に変更sum[i][j]するsum[j][i]場合など)が機能することを示唆していますが、その場合もセグフォルトが発生します。これにより、ポインターで何か間違ったことをしている可能性があると思いました (私は C++ に少し慣れていません)。そのため、sum を整数の配列に変更したため、次のようになりました。

#include<array>
#include<iostream>

int main() {
        std::array<std::array<int, 5>, 4> sum;

        //Initialize sum array
        std::cout << sum.size() << " " << sum[0].size() << "\n";
        for (size_t i = 0; i < sum.size(); i++) {
                for (size_t j = 0; j < sum[0].size(); j++) {
                        if (i == 0 || j == 0)
                                sum[i][j] = 0; //works as sum[j][i] too!!!
                        else
                                sum[i][j] = 1;

        std::cout << sum[i][j];
                }
     std::cout << "\n";
        }

        std::cout << "here\n";
    return 0;
}

どちらが機能し、出力します:

4 5
00000
01111
01111
01111
here

sum[i][j]ただし、 を に切り替えるとsum[j][i]、同じことが機能して出力されるため、混乱しています。sum[5][0]最初に実行される内側のループの最後の反復中に試行すると、seg-fault が発生することが予想されます。私は今、自分自身を混乱していると呼んでいます。何が起こっている?

追加情報: -std=c++11 フラグを設定して g++ 4.8.4 を使用しています。

4

2 に答える 2