cのポインターへのポインタ
-
27-10-2019 - |
質問
私は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
仕上げ(テストされていないが)。