c - 在 C 中初始化长嵌套结构

标签 c memory-management

当每个结构仅包含指向其他结构的指针时,初始化(在本地函数中)长链嵌套结构的最佳/最干净的方法是什么,如下所示:

typedef struct A{
struct B{
    struct C *c /* OPTIONAL */;
    struct D *d /* OPTIONAL */;
    struct E *e /* OPTIONAL */;
    struct F *f /* OPTIONAL */;
} *b;
struct G{
    struct F *f /* OPTIONAL */;
    struct D *d /* OPTIONAL */;
    struct H *h /* OPTIONAL */;
    struct F *f /* OPTIONAL */;
} *g;
    } a;

每个指向嵌套结构的指针本身都指向包含指向其他嵌套结构的指针的结构(我知道,这很疯狂!)

我认为我需要为每个结构成员定义一个 tmp 指针并为其分配内存以及一个 tmp 结构变量并将前者指向后者:

B *b_ptr = CALLOC(1,sizeof(b_ptr));
B b_tmp;
b_ptr = &b_tmp;
b_tmp.itsMember1 = CALLOC(1,sizeof(itsMember1));
TypeOfItsMember1 itsMember1_tmp;
..
..

这将需要大量的局部变量和痛苦的重复编码。有没有更好的方法来完全初始化父结构?

家里有专家愿意捐2分钱吗?

最佳答案

您可以首先编写一组分配和初始化各种嵌套结构的函数。

struct C *NewC(int f1, int f2, ...)
{
    struct C *result = malloc(sizeof(*result));
    result->f1 = f1;
    result->f2 = f2;
    .....
    return result;
}

对其他结构进行同样的操作。

然后您可以将这些构建 block 与标准结构初始值设定项结合使用:

struct B b = {
    NewC(42, 666, ...),
    NULL, 
    NULL,
    NewF(....)
};

如果您想在堆而不是堆栈上分配 struct B,那么您可以以类似的方式编写 NewB 函数。

这种方法的优点是,如果您向结构添加字段,您只需向 NewX 函数添加额外的参数,编译器将强制该结构的任何客户端提供额外的参数。

关于c - 在 C 中初始化长嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9894943/

相关文章:

无法使用 -std=c99 找到 math.h 常量?

Java GC 问题 : How could an object become unreachable while one of its methods is still being executed?

c++ - 在 libuv 应用程序中删除后使用?

javafx调整图像大小的内存消耗提示

c - 多线程启动顺序

c - 如何从 C 中的 char 函数返回字符串

memory-management - 如何在 Python 中创建空列表的列表或元组?

java - 不可变对象(immutable对象)的内存管理

c - c 中 strtok() 的使用显示警告并返回段错误(核心已转储)

c++ - 在 C/C++ 中处理内存不足情况的优雅方式是什么?