我以为我喜欢 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]
's 切换为sum[j][i]
's,它也可以工作并输出相同的东西!sum[5][0]
当我第一次运行内部循环的最终迭代期间尝试时,我希望得到一个段错误!我现在愿意称自己很困惑。到底是怎么回事?
额外信息:我正在使用带有 -std=c++11 标志的 g++ 4.8.4。