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

时间:2014-05-15 11:09:46

标签: c 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-> %d\n B-> %d\n ", b.a->n1,  b.n2 );

 }

所以我想要的是声明并初始化类型b的结构,发送一个已经有值的malloc。所有这一切都在同一个表达上。

用oop语言我会做这样的事情:

 B = new B((new A()).n1=10,20);

P.S:我知道我可以对它进行malloc并在另一条指令上设置一个值,我只是好奇我是否可以在初始化时进行。

2 个答案:

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

不同之处在于后者更具可读性。