2016-04-29 11 views
2

私は "ユニオン検索"をしようとしています。ここで複雑な2D配列を割り当てることができません

は私のコードです:

UnionFind uf_create(){ 
    UnionFind uf= malloc(sizeof(UnionFind)); 
    uf->vt=malloc(11*sizeof(VertexTree*)); 
    uf->nbElems=VERTEX_MAX; 
    uf->nbGroups=VERTEX_MAX; 
    int i; 
    for(i=0;i<uf->nbElems;i++){ 
     printf("%d\n", i); 
     uf->vt[i]->vtx=i+1; 
     uf->vt[i]->parent=uf->vt[i]; 
    } 
    return uf; 
} 

UnionFindがで定義されます。

typedef struct unionfind{ 
    unsigned int nbElems; 
    unsigned int nbGroups; 
    VertexTree **vt; 
}*UnionFind; 

そして、ここではツリーの定義です:

typedef struct sTree{ 
    GraphVertex vtx; 
    struct sTree* parent; 
}VertexTree; 

私はセグメンテーション違反がある知っていますツリーが正しく割り当てられていないためです。 頂点のツリーにメモリを正しく割り当てる方法を教えてもらえますか?

おかげ

+0

- > vtx'未定義の動作を引き起こします。 'uf-> nbGroups = ...'の直後に各vt [i]を初期化するforループを書くべきです。 – ddz

+0

これは私がやったことです、今、segfaultは割り当て行で起こっています( "uf-> vt [i] = malloc(sizeof(VertexTree));") – Elirovi

+0

'for(i = 0; i <11; + + i){uf-> vt [i] = malloc(sizeof ** uf-> vt); } 'はあなたにセグメンテーションを与えていますか? – ddz

答えて

0

問題が見つかりました。

"ポインタのポインタ"(** vt)を割り当ててから、forループの各ツリーのポインタを割り当てる必要がありました。

だから、最終的なコードは次のとおりです。 `uf-> VT [i]のアクセス

UnionFind uf_create(){ UnionFind uf= malloc(sizeof(UnionFind)); uf->nbElems=VERTEX_MAX; uf->nbGroups=VERTEX_MAX; uf->vt=malloc(VERTEX_MAX*sizeof(VertexTree*));//uf->vt is now defined int i; for(i=0;i<uf->nbElems;i++){ uf->vt[i]=malloc(sizeof(VertexTree));//I can now allocate the trees one by one uf->vt[i]->vtx=i+1; uf->vt[i]->parent=uf->vt[i]; } return uf; }

+0

私は 'sizeof'についてあなたに言ったことを覚えていますか? 'UnionFind uf = malloc(sizeof(UnionFind));'は 'struct unionfind * uf = malloc(sizeof(struct unionfind *));'としてコンパイラに見えますが、これは間違っています。実際に 'struct unionfind'のためのスペースが必要な場合は、' struct unionfind'の**ポインタ**のためのスペースを割り当てています。それを 'UnionFind uf = malloc(sizeof * uf);に変更し、まだ動作するかどうかを確認してください。 – ddz

+0

Btw、あなたは既に "ポインタのポインタ"を 'uf-> vt = malloc(11 * sizeof(VertexTree *));'で割り当てていました。私は '11 == VERTEX_MAX'と思っていました。それ以外の場合、forループは範囲外のインデックスにアクセスしていました。 – ddz

0

UnionFind uf= malloc(sizeof(UnionFind));

私はこれがあなたの問題のラインだと思います。..

UnionFindのでsizeofのみお使いのマシンのためのポインタのサイズを返しますポインタ型です。

試してみてください。

UnionFind uf= malloc(sizeof(struct unionfind));

これは、構造の実際のサイズを返します。

+0

私は実際に問題を見つけましたが、とにかく:) – Elirovi

+0

@Eliroviこれがあなたの質問に答えるなら、あなたが問題を見つけたとしてもそれを答えとして受け入れることを検討してください。それはもっと詳細な答えかもしれませんが、それでも答えはあります。 – ddz

+0

'struct unionfind'を試したところ、うまく動作しませんでした。申し訳ありません – Elirovi