我以为我喜欢从C++ 11中获得std :: array的想法,但它看起来像有一些夸克。我发现了这一点,因为下面的代码给出了一个段故障:2维std :: array woes
#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列的数组。但是,当我尝试执行此程序时(如上所示),我遇到了分段错误。 This link建议颠倒我访问我的数组的方式(如更改sum[i][j]
至sum[j][i]
)的顺序应该可行,但我也会遇到seg-fault。这使我觉得我可能已经做错事与我的指针(我有点生疏我的C++),所以我改变总和是整数数组,所以它的内容如下:
#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!我现在愿意称自己为hela困惑。到底是怎么回事?
其他信息:我正在使用g ++ 4.8.4和-std = C++ 11标志集。
您在第一个片段中有未初始化的'int *'... – Jarod42
您不应该取消引用未初始化的指针。在第二个片段中,它不是'int *' – Gombat
出界访问是UB,并且*“working”*是有效的UB。 – Jarod42