在一个结构体中动态分配另一个结构体

6
我正在动态分配一个结构体,其中包含一个不同的结构体作为成员:
struct a {
   // other members
   struct b;
}
struct b 基本上是保存指向另一个 struct b 的指针,因此将 struct b 视为链表。
如果我动态分配 struct a ,那么这也会在其中创建一个新的 struct b 。但是,这样做和让 struct a 持有指向 struct b 的指针,在 struct a 中动态分配 struct b 之间有什么区别?实现方式上有什么区别?
3个回答

10

首先,让我们明确一些真正的定义,以使这个问题更具体化。

struct b {
    int x;
};

struct a_with_b {
    struct b b;
}

struct a_with_b_ptr {
    struct b *bp;
}
当你封装一个结构体时,只需要分配外部结构体的空间(由于内部结构体不是指针类型,因此使用点号.来引用内部结构体的成员):
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;

9
如果你像这样动态分配(malloc)struct a
struct a *temp = (struct a *)malloc(sizeof(struct a));

你需要为指向 struct b 的指针分配空间(假设在 struct a 中是这样的),但你没有为 struct b 分配空间。这意味着以后你必须进行 malloc
temp->b = (struct b *)malloc(sizeof(struct b));

在尝试使用 struct b 之前,请注意:

如果您直接存储 struct b 而不是指针,则在定义 struct a 时将获得自动分配。


3

这种区别与比较“自动”和“动态”分配的任何其他情况相当。 1

关于何时应该使用指针成员的指南,我会说,除非有充分的理由不使用它,否则应该避免使用它,因为手动内存管理需要程序员付出额外的努力(并且它必然导致错误)。

一个好的理由是,如果您需要让您的结构体a引用现有的结构体b


1. “automatic”是C标准中用于描述此类分配的术语,因为内存会被自动清除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接