如何为嵌入的结构赋值

时间:2018-06-11 08:30:24

标签: c

如果我有2个结构,其中一个结构用作其他结构的其中一个成员的数据类型,如果已经为用作数据类型的结构赋值,我该如何赋值。

typedef struct
{datatype *a;datatype b;datatype c;} structa;
typedef struct
{datatype a;structa *b;}structb;

structa A[]={{&a, b, c}, {&d, e, f}};
structb B={g, &A};

这是对的吗?

2 个答案:

答案 0 :(得分:0)

简短回答:是的。

有一个简单的演示:

#include <stdio.h>

typedef struct A
{
    int a1;
    int a2;
} A;

typedef struct B
{
    A ba;
    A *pba;
    int b1;
    int b2;
} B;

int main(int argc, char *argv)
{
    A a;
    B b1, b2;
    a = (A) {1, 2};
    b1 = (B) {a, &a, 3, 4};
    b2 = (B) {a, &a, 5, 6};

    B bs1[] = {b1, b2};
    B bs2[] = {(B){a, &a, 7, 8},(B){a, &a, 9, 10}};

    printf("a: {%d, %d}, addr of a: %p\n", a.a1, a.a2, &a);
    printf("b1: {{%d, %d}, %p, %d, %d}\n", b1.ba.a1, b1.ba.a2, b1.pba, b1.b1, b1.b2);
    printf("b2: {{%d, %d}, %p, %d, %d}\n", b2.ba.a1, b2.ba.a2, b2.pba, b2.b1, b2.b2);
    printf("bs1[0]: {{%d, %d}, %p, %d, %d}\n", bs1[0].ba.a1, bs1[0].ba.a2, bs1[0].pba, bs1[0].b1, bs1[0].b2);
    printf("bs1[1]: {{%d, %d}, %p, %d, %d}\n", bs1[1].ba.a1, bs1[1].ba.a2, bs1[1].pba, bs1[1].b1, bs1[1].b2);
    printf("bs2[0]: {{%d, %d}, %p, %d, %d}\n", bs2[0].ba.a1, bs2[0].ba.a2, bs2[0].pba, bs2[0].b1, bs2[0].b2);
    printf("bs2[1]: {{%d, %d}, %p, %d, %d}\n", bs2[1].ba.a1, bs2[1].ba.a2, bs2[1].pba, bs2[1].b1, bs2[1].b2);

    return 0;
}

代码的输出是:

a: {1, 2}, addr of a: 0x7fffb2040240
b1: {{1, 2}, 0x7fffb2040240, 3, 4}
b2: {{1, 2}, 0x7fffb2040240, 5, 6}
bs1[0]: {{1, 2}, 0x7fffb2040240, 3, 4}
bs1[1]: {{1, 2}, 0x7fffb2040240, 5, 6}
bs2[0]: {{1, 2}, 0x7fffb2040240, 7, 8}
bs2[1]: {{1, 2}, 0x7fffb2040240, 9, 10}

答案 1 :(得分:-1)

简短回答:不。

Medium answere:foo.c:8:15:警告:从不兼容的指针类型初始化[-Wincompatible-pointer-types]

长答案:&amp; A是structa数组的地址,是指向structa数组的指针。但是structb只需要一个指向structa的指针。否则就是对的。