省流版本:编译器编译时需要确定结构体占用的空间大小,结构体中若有成员变量定义为自身结构体的话编译器无法确定大小,但如果成员变量定义的自身结构体的指针,则可以通过编译,因为指针大小是给定的。
首先我是蒟蒻,错误也很愚蠢,学术不精,只作为个人学习的记录,说法不一定正确,欢迎大佬指正以及补充
首先遇到的场景为 写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