0

私は初心者で、動的メモリ割り当てに非常に苦労しています。誰かがこの問題で私を助けることができれば、私は本当に感謝しています.

以下を使用して、malloc を使用して配列 Node にメモリを割り当てます。

struct nodeT {
int id;
nodeT *parent, *T1, *T2;
};

struct nodeT* T;
T =  (struct nodeT*) malloc( 256*sizeof(struct nodeT) );

Then in order to reference T, I use a an array of pointers to T, call it Tptr:

struct nodeT** Tptr;
Tptr = (struct nodeT**) malloc( 256*sizeof(struct nodeT*) );

私のコードでは、T にデータを入力し、次のように *Tptr = T を繰り返し設定します。

nodeT* s = &T[ 1*21 ];
s->id=23;
s->T1=...
s->T2=...
s->parent=...

その後

sptr = &Tptr[ 1*21 ];
*sptr=s;
and it works fine.

しかし、realloc を呼び出して T のサイズを増やし、*sptr をチェックすると、有効ではなくなり、実行時にセグメンテーション エラーが発生することがあります。*sptr が古い場所を指し続けている間に、realloc がメモリ ブロック全体を新しい場所に移動する場合があると思います。

すべての再割り当ての後にすべての Tptr を更新するにはどうすればよいでしょうか。

最初から大きなサイズの T を使用し、T の realloc を無効にすると、すべて正常に動作します。しかし、動的に増加する配列サイズで動作するようにしたいです。

よろしくワジャハット

4

1 に答える 1

0

malloc の呼び出しで T が設定されます。re-alloc を呼び出すと、T が同じ場所にあるとは想定できません。Tptr は呼び出し後に Tptr = T に設定されるためです。

T =  (struct nodeT*) malloc( 256*sizeof(struct nodeT) );

ポインターの配列 TPtr は、T の再割り当てのたびに再設定する必要があります。これを自分で行いたくない場合は、配列ではなくベクトルを使用して再割り当てします。

于 2012-10-28T18:46:54.713 に答える