1

グローバル変数を含む共有ライブラリがあります

    int ***carg;

この変数は関数で初期化されます

    __attribute__((コンストラクター)) void init(void) {
        carg = generator->get_carg();
    }

どこ

    int*** get_carg();

事前に初期化された carg 配列を返すだけです。

このライブラリがロードされている場合、セグメンテーション違反があります

プログラム受信信号 SIGSEGV、セグメンテーション違反。init () の 0x00007fffebe05fea at /path/to/project/main.cpp:814

この枠で

    (gdb) プリントカーグ
    $1 = (int ***) 0x0
    (gdb) ジェネレーターを呼び出します->get_carg()
    $2 = (int ***) 0xf12410

この代入 (1 つのポインターが別のポインターに代入される) がセグメンテーション違反の原因になるのはなぜですか? そして、どうすればこの変数を初期化できますか?

UPD: まだ答えはわかりませんが、carg変数の名前が変更された場合、エラーは発生しません。この名前の変数がもう 1 つあると思ったのですが、そうではありません。

4

1 に答える 1

1

おそらくジェネレーター変数はまだ初期化されておらず、有効なオブジェクトを指していません。

get_cargs() を呼び出すと、セグメンテーション違反が発生します。

于 2013-04-21T10:49:22.790 に答える