这可能没有任何意义,但我想让它脱离我的脑海。我怎么能这样做?
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-> %d\n B-> %d\n ", b.a->n1, b.n2 );
}
所以我想要的是声明并初始化类型b的结构,发送一个已经有值的malloc。所有这一切都在同一个表达上。
用oop语言我会做这样的事情:
B = new B((new A()).n1=10,20);
P.S:我知道我可以对它进行malloc并在另一条指令上设置一个值,我只是好奇我是否可以在初始化时进行。
答案 0 :(得分:4)
您可以为此目的定义一个函数,并在初始化程序中使用它:
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-> %d\n B-> %d\n ", b.a->n1, b.n2 );
return 0;
}
答案 1 :(得分:1)
这可能没有任何意义
事实上,它毫无意义,没有任何意义。但如果你因为未知的原因坚持这样做,那么最好的方法是使用复合文字,而不是动态内存分配。
struct b b =
{
&(struct a){10},
20
};
这样,成员结构与变量b
具有相同的范围,因为复合文字的范围与局部变量的范围相同。这样,不需要额外的malloc / free。
请注意,复合文字是C语言的一个多余功能。上面的C代码将完全与
相同的机器代码 struct a a = {10};
struct b b =
{
&a,
20
};
不同之处在于后者更具可读性。