2016-04-29 94 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

访问'UF-> VT [I] - > vtx'导致未定义的行为。你应该在'uf-> nbGroups = ...'之后立即写一个for循环来初始化每个vt [i]。 – ddz

+0

这就是我刚刚做的,现在段错误发生在分配线(“uf-> vt [i] = malloc(sizeof(VertexTree));”) – Elirovi

+0

(i = 0; i <11; + + i){uf-> vt [i] = malloc(sizeof ** uf-> vt); }'给你段错误? – ddz

回答

0

我发现问题了!

我不得不分配“指针指针”(** vt),然后为for循环中的每个树分配指针。

所以最后的代码是:

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

顺便说一句,你已经用'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

我刚刚尝试'结合unionfind'它没有工作。对不起 – Elirovi