c - 如何为嵌入的结构体赋值

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

这是正确的吗?

最佳答案

简短回答:是的。

有一个简单的演示:

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

关于c - 如何为嵌入的结构体赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50793412/

相关文章:

c - 在另一个函数中使用输入的值

c++ - 3个过程的严格交替

c - 如何更改内核空间堆的权限?

c - malloc 有时会失败。或者 pread 有时会失败

c++ - cpp程序中system函数的使用

c - 进程异常终止时的资源清理

java - 使用 c 调用 REST 服务,通过 GSM 调制解调器连接 - HTTP/1.1 505

c - 如何使用 Dtrace 计算任意 C 语句之间的时间

c - 如何知道 pthread 已停止?

c - c99 中与类型无关的 memcpy