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