结构体互为成员

本文探讨了结构体中互为成员的情况,指出直接使用结构体会导致尺寸无限的问题。为解决这个问题,建议使用指针作为成员,因为指针大小固定,避免了循环引用的困境。在初始化后,可以通过指针实现结构体间的相互引用,但具体指向关系需在初始化时确定。



今天突然看到一个结构体互相作为成员变量的问题,感觉很有趣。有人说这无异于自己揪着自己的头发把自己提起来。觉得这个比喻很有趣。

然后自己尝试做了实验;

#include <stdio.h>
typedef struct A testA;
typedef struct B testB;
struct A{
        testB b;
        char namea;
};
struct B{
        testA a;
        char nameb;
};
int  main(int argc,char ** args)
{
        testA testa;
        testB testb;
        return 0;
}
[root@localhost hi]# gcc teststruct.c  -o teststruct
teststruct.c:5: 错误:字段‘b’的类型不完全


这样的话 A结构的sizeof就是无穷了,因为A结构会间接循环调用A,不想头文件那样有宏的控制,可以避免循环调用

有一个前提是结构体的大小应该是固定的,要不然怎么能成为结构呢。所以这个时候可以使用指针,指针的大小是固定的,指针不能初始化实例,但是能指向结构B。


#include <stdio.h>
typedef struct A testA;
typedef struct B testB;
typedef struct A* pA;
typedef struct B* pB;
struct A{
        pB b;
        char namea;
};
struct B{
        pA a;
        char nameb;
};
int  main(int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值