2012-03-25 178 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;