我以爲我喜歡從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