这可能没有任何意义,但我想把它从我的脑海中解脱出来。我该怎么做呢?
struct a { int n1; };
struct b { struct a *a; int n2; };
int main(void)
{
struct b b = { (struct a*)malloc(sizeof(struct a)) {10} , 20 };
printf("A-> %dn B-> %dn ", b.a->n1, b.n2 );
}
所以我想要的是声明和初始化一个b类型的结构体,发送一个已经有值的malloc。
在oop语言中,我会这样做:
B = new B((new A()).n1=10,20);
p。S:我知道我可以对它进行malloc,并在另一条指令上设置一个值,我只是想知道我是否可以在初始化时这样做。
您可以为此目的定义一个函数,并在初始化式中使用它:
struct a *a_maker(int v) {
struct a *p = malloc(sizeof(struct a));
p->n1 = v;
return p;
}
int main(void) {
struct b b = { a_maker(10) , 20 };
printf("A-> %dn B-> %dn ", b.a->n1, b.n2 );
return 0;
}
这可能没有任何意义
的确,这是毫无意义的,没有任何意义。但是,如果您出于未知的原因坚持这样做,那么最好的方法可能是使用复合文字,而不是动态内存分配。
struct b b =
{
&(struct a){10},
20
};
这样,成员结构体与变量b
具有相同的作用域,因为复合字面值的作用域与局部变量的作用域相同。这样,就不需要额外的malloc/free。
请注意复合字面值是C语言的多余特性。上面的C代码将生成与
完全相同的机器码: struct a a = {10};
struct b b =
{
&a,
20
};
的区别在于后者更易读。