我如何用结构指针初始化一个结构(使用malloc),并在同一个表达式上发送一个值



这可能没有任何意义,但我想把它从我的脑海中解脱出来。我该怎么做呢?

 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 
  };

的区别在于后者更易读。

相关内容

  • 没有找到相关文章

最新更新