2012-03-25 202 views
4

中我動態分配具有不同的結構作爲成員的結構:動態分配結構一個結構

struct a { 
    // other members 
    struct b; 
} 

struct b基本上具有指向另一個struct b,這樣想的struct b作爲一個鏈表。

如果我動態分配struct a,那麼它也會在其中創建一個新的struct b。然而,這樣做或有struct a持有指針struct b,並在struct a內動態分配struct b之間的區別是什麼?實施有什麼不同?

回答

8

如果動態分配(malloc的)struct a

struct a *temp = (struct a *)malloc(sizeof(struct a)); 

您爲指針struct b(假設這就是在struct a),但你不知道的struct bmalloc空間malloc空間。這意味着以後你就必須做

temp->b = (struct b *)malloc(sizeof(struct b)); 

您嘗試使用struct b之前。

如果您不直接存儲指向struct b的指針,而是直接存儲struct b,那麼當您定義struct a時,您將獲得自動分配。

3

這種差異實際上等同於您比較「自動」和「動態」分配的任何其他情況。根據指南,當你應該使用一個指針成員時,我會說你應該避免它,除非有充分的理由不去處理手動內存管理的程序員開銷(和它不可避免地導致的錯誤)。

如果你需要你的struct a來引用現有的結構b,一個很好的理由的例子是。


1.「自動」是C標準中用於此類分配的術語,因爲內存自動清理。

9

首先,讓我們得到一些真正的定義來制定具體的。

struct b { 
    int x; 
}; 

struct a_with_b { 
    struct b b; 
} 

struct a_with_b_ptr { 
    struct b *bp; 
} 

當封裝一個結構,你只需要分配外結構(和由於內結構不是指針,可以使用.引用innert結構的成員):

struct a_with_b *a1 = malloc(sizeof(struct a_with_b)); 
a1->b.x = 3; 

但是當你封裝一個指針時,你必須獨立地分配,並且在引用內部結構的成員時使用->

struct a_with_b_ptr *a2 = malloc(sizeof(struct a_with_b_ptr)); 
a1->b = malloc(sizeof(struct b)); 
a1->b->x = 3;