C语言定义结构体成员不能为自身的原因

省流版本:编译器编译时需要确定结构体占用的空间大小,结构体中若有成员变量定义为自身结构体的话编译器无法确定大小,但如果成员变量定义的自身结构体的指针,则可以通过编译,因为指针大小是给定的。

首先我是蒟蒻,错误也很愚蠢,学术不精,只作为个人学习的记录,说法不一定正确,欢迎大佬指正以及补充

首先遇到的场景为 写BFS题的时候,常常想在定义结构体的同时,在成员变量中定义一个一个成员为自身结构体数组的结构体,例如

typedef struct t
{
    int data;
    struct t som[10];
} t;

结果编译错误

那么到底是什么原因呢?

我们使用一个简化的但错误类型一致的结构体,将结构体数组换成定义了一个类型为自身结构体变量,编译结果同样是错误无法通过的。

typedef struct t
{
    int data;
    struct t son;
} t;

结构体在定义的时候编译器需要知道结构体的内存大小,这个大小是必须确定的,而我们在定义这个结构体时又定义了一个自身类型的结构体,那么显然编译器在编译时在确认struct t的内存大小时:
data占4个字节,son占(data占4个字节,son占(.......))个字节,这是一个无限递归的过程,因此编译器无法确定大小,所以这种定义不合法。
 
但是当我们将这个变量定义成指针的时候,编译是可以通过的,这是因为指针的大小是固定的

typedef struct t
{
    int data;
    struct t *son;
} t;

typedef struct t
{
    int data;
    struct t *som;
} t;
int main()
{
    t *temp;
    int *temp1;
    char *temp2;
    double *temp3;
printf("t指针大小为:%d\nint指针大小为:%d\nchar指针大小为:%d\ndouble指针大小为:%d\n",sizeof(temp),sizeof(temp1),sizeof(temp2),sizeof(temp3));
    return 0;
}

输出结果如下:

t指针大小为:8
int指针大小为:8
char指针大小为:8
double指针大小为:8

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值