質問

私はCのポインターの助けが必要です。

    typedef struct s{
        s2** d;
        struct s* next;
    }s;


 typedef struct s2{
        c* fi;
        struct s2* next;
    }s2;

そして、私はこのような機能を持っています:

void modify(c* a, s2* b){   //c* is a pointer to a struct
    s* rd = malloc(sizeof(s);
    rd->next = NULL;
    //need also to initialize the field "d" of the "s" struct
}

これはエラーを生成しています。例のように、Bを指す構造RDが必要です。 S2はリストのような方法でリンクされているため、二重のポインターを保存する必要があるため、リストの最初の要素を削除する可能性があるために**ポインターが必要です。私はrd-> d =&bのようなコメントで割り当てを行っていましたが、関数でフィールド「D」を敬意を払おうとすると、無効なメモリが読まれていますが、その理由がわかりません。

役に立ちましたか?

解決

問題はこれだと思います:

あなたは渡ります s2* b の議論として modify, 、したがって、このポインターはスタックにあります。今、あなたが割り当てるとき rd->d = &b, 、あなたはその場所をスタックに持ち込みます。これは、実行が範囲を離れるまでのみ有効になります modify. 。したがって、あなたが拒否するとき rd->d その後、スタックに(現在は無効な)場所にアクセスし、ゴミやクラッシュが生成されます。 (ただし、このシナリオでは、黙想できるはずです rd->d まだ入っている間に正しく modify.)

おそらくあなたはその方法を変えたいと思うでしょう b 変更に渡され、おそらくおそらく s2** b, 、そのため、ポインタにポインターを正しく渡すことができます s2 別の構造では、それをポインターにする代わりに s2 スタックの上に座っています modify.

基本的にこのように:

void modify(c* a, s2** b) {
    s* rd = malloc(sizeof(s));
    rd->next = NULL;
    rd->d = b;
}

そして、それをそのように呼びます

s2* myS2 = ...;
modify(<whatever>, &myS2->next);

これにより、ポインターの場所を渡すことができるはずです s2 後であっても、保存して繰り返しできるインスタンス modify 仕上げ(テストされていないが)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top