Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Segmentation faultこわい

フリじゃなくてSegmentation faultきらいです(じょしらくにハマってるオタク)。

なんかやけにセグフォールト(セグメンテーションフォールトの略)に出くわしている気がするので、出くわした状況をメモしていこうという記事です。

パターン1: 2次vectorの初期化わすれ

こういうケースです。

#include <vector>

using namespace std;
int main() {
    vector<vector<int>> x;
    x[0][0] = 3; // Segmentation fault
    return 0;
}

解決策はこうです。

#include <vector>

using namespace std;
int main() {
    vector<vector<int>> x(1, vector<int>(1));
    x[0][0] = 3; // OK
    x[0][1] = 3; // OK
    return 0;
}

ただし、 この場合 x[1][0] = 3 とするとセグフォールトが起きます。これは以下のどれかで解消できます。

#include <vector>

using namespace std;
int main() {
    vector<vector<int>> x1(1, vector<int>(1));
    vector<vector<int>> x2(2, vector<int>(1)); // 初期化時点で要素数を増やす
vector<vector<int>> x3(1, vector<int>(1));

    x1.push_back(vector<int>(1)); // あとから追加する
    x1[1][0] = 3;
    x2[1][0] = 3;
    x3.resize(2); // サイズを変更する
    x3[1][0] = 3;
    return 0;
}