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 を使用しています。