2016-04-29 5 views
2

Ich versuche eine "Union-Find" zu machen.Kann kein komplexes 2D-Array zuweisen

Hier ist mein Code:

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; 
} 

Die UnionFind ist definiert durch:

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

Und hier ist die Definition des Baumes:

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

Ich weiß, die segfault ist weil der Baum nicht richtig zugeordnet ist. Kann mir bitte jemand sagen, wie man den Speicher für den Knotenbaum richtig zuordnet?

Dank

+0

Zugriff 'UF-> vt [i] -> vtx' undefiniertes Verhalten verursacht. Sie sollten eine for-Schleife schreiben, die jedes vt [i] direkt nach uf-> nbGroups = ... initialisiert. – ddz

+0

Das habe ich gerade gemacht, jetzt passiert der Segfault in der Zuweisungszeile ("uf-> vt [i] = malloc (sizeof (VertexTree));") – Elirovi

+0

'für (i = 0; i <11; + + i) {uf-> vt [i] = malloc (Größe von ** uf-> vt); } 'gibt Ihnen segfault? – ddz

Antwort

0

Ich habe das Problem gefunden!

Ich musste den "Zeiger der Zeiger" (** vt) zuordnen und dann die Zeiger für jeden Baum in einer for-Schleife zuordnen.

So ist der endgültige Code lautet:

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

Erinnerst du dich, was ich dir über 'sizeof' erzählt habe? 'UnionFind uf = malloc (sizeof (UnionFind));' wird vom Compiler als 'struct unionfind * uf = malloc (sizeof (struct unionfind *)); 'angesehen, was falsch ist. Sie vergeben Speicherplatz für einen ** Zeiger ** von 'struct unionfind', wenn Sie eigentlich Platz für eine 'struct unionfind' haben wollen. Ändere es in 'UnionFind uf = malloc (sizeof * uf); 'und schau, ob es noch funktioniert. – ddz

+0

Btw, Sie haben bereits "den Zeiger von Zeigern" mit "uf-> vt = malloc (11 * sizeof (VertexTree *));' zugewiesen. '. Ich dachte, dass 11 == VERTEX_MAX, sonst Ihre FOR-Schleife Zugriff auf Indizes außerhalb der Grenzen. – ddz

0

UnionFind uf= malloc(sizeof(UnionFind));

Ich denke, diese Linie ist Ihr Problem ..

UnionFind ist ein Zeigertyp so sizeof nur die Größe eines Zeigers für Ihre Maschine zurück.

Versuche:

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

Dies wird die tatsächliche Größe der Struktur zurück.

+0

Ich habe eigentlich nur das Problem trotzdem danke :) – Elirovi

+0

@Elirovi wenn dies Ihre Frage beantwortet, auch wenn Sie das Problem gefunden haben, in Betracht ziehen, es als Antwort zu akzeptieren. Es könnte eine detailliertere Antwort sein, aber es ist immer noch eine Antwort. – ddz

+0

Ich habe gerade versucht mit 'struct unionfind' es hat nicht funktioniert. Sorry – Elirovi

Verwandte Themen