2016-04-25 19 views
0

So habe ich Struktur eine Vereinigung enthält, wie folgt:Zugriff auf Zeiger in einem Zeiger auf eine Union

struct FILL{ 
    char *name; 
    int id; 
}; 

struct TEST{ 
    union{ 
    struct FILL *fill; 
    int type; 
    } *uni; 
}; 

Ich verstehe nicht, wie die Gewerkschaftsmitglieder innerhalb der Struktur zuzugreifen. Ich habe versucht, es wie folgt zu tun:

Aber ich bekomme segfaults, wenn ich dies versuche. Beziehe ich diese falsch? Wie soll ich es sonst machen?

Edit: Sorry, ich konzentrierte mich auf die Formatierung und ich vermasselte die Deklaration für TEST. Es wurde behoben.

+3

Wie über eine vollständige und korrekte Deklaration von 'struct test' Bereitstellung? Der von Ihnen präsentierte scheint abgeschnitten zu sein. –

+1

Es tut mir leid, das war ein Fehler meinerseits, ich habe es korrigiert, aber das war die vollständige Erklärung. – Phenom588

+0

Was ist der Zweck von "Typ" innerhalb der Union, wenn Sie nie in der Lage sein werden, es zu benutzen? Sie sollten 'type' in die Struktur und den Rest in die union einfügen. – 2501

Antwort

2

Jedes Zeigerelement der Struktur muss initialisiert werden, entweder durch Zuweisen des dynamischen Speichers durch malloc, oder durch Zuweisen anderer Variablen. Hier sind die Probleme des Codes:

struct TEST *test_struct, *test_int; 

test_struct = malloc(sizeof(struct TEST)); 
test_struct->uni = malloc(sizeof(struct TEST)); // uni should be allocated with size of the union, not the struct 
test_struct->uni->fill->name = NULL; // uni->fill is a pointer to struct FILL, it should be allocated too before accessing its members 
test->struct->uni->fill->id = 5; 

test_int = malloc(sizeof(int)); // test_int is of type struct TEST, you are allocating a integer here 
test_int->uni->type = 10; // same, uni not allocated 

Also versuchen Sie das folgende Update:

struct TEST *test_struct, *test_int; 

test_struct = malloc(sizeof(struct TEST)); 
test_struct->uni = malloc(sizeof(*test_struct->uni));   
test_struct->uni->fill = malloc(sizeof(struct FILL)); 
test_struct->uni->fill->name = NULL; 
test_struct->uni->fill->id = 5; 

test_int = malloc(sizeof(struct TEST)); 
test_int->uni = malloc(sizeof(*test_struct->uni)); 
+0

Was ist das Problem? warum das runter? – fluter

+0

Ich bin mir nicht sicher, wer das getan hat? Aber das war genau das, was ich brauchte, vielen Dank! Es scheint, als hätte ich ein grundlegendes Missverständnis in Bezug auf die Gewerkschaften. Ich dachte, dass ich bei der Zuweisung von Erinnerungen, die ich für jedes Gewerkschaftsmitglied verwenden würde, die Gewerkschaft die Größe dieses Mitglieds hätte. – Phenom588