2016-04-25 74 views
0

所以我有一個包含一個聯合結構如下:的指針訪問指針工會

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

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

我不明白如何在結構中訪問工會成員。我一直試圖做到這一點如下:

struct TEST *test_struct, *test_int; 

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

test_int = malloc(sizeof(int)); 
test_int->uni->type = 10; 

但我得到segfaults,當我嘗試這個。我訪問這些錯誤嗎?我應該怎麼做呢?

編輯:對不起,我是專注于格式化和我搞砸了測試聲明。它已被修復。

+3

如何提供'結構TEST'的完整,準確的申報?你提交的那個似乎被截斷了。 –

+1

沒有遺憾,是我犯的一個錯誤,我已經糾正了,但,這是完整的聲明。 – Phenom588

+0

什麼是'type'聯盟內部的目的,如果你永遠不會成爲能夠使用它?你應該把'type'放在struct中,其餘的放在union中。 – 2501

回答

2

每個該結構的指針構件必須被初始化,或者通過由malloc分配動態存儲,或分配給其他變量。這裏是你的代碼的問題:

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 

所以請嘗試以下修正:

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

有什麼問題?爲什麼下降? – fluter

+0

我不確定是誰做的?但那正是我所需要的,非常感謝你!看起來,我對工會有一種有趣的誤解,我認爲當我分配內存時,我將分配給我使用的任何工會成員,而工會則是該成員的大小。 – Phenom588