【正确答案】
【答案解析】用常规的定义相互引用的结构一般容易出现类似于死锁一样的问题。例如,A引用B的成员,B也引用A的成员,由于C语言需要先声明后使用,所以常规的方法会引起编译器错误。
程序示例如下:
typedef struct
{
int afield;
BPER bpointer;
}*APTR;
typedef struct
{
int bfield;
APTR apointer;
}*BPTR;
上例中BPER没有被定义就已经被使用了,所以错误,需要采取其他的方式来实现。指针就是一种不错的方式,以下方式都可以实现定义一对相互引用的结构。
struct b;∥此处使用结构体的不完整声明
struct a
{
int afield;
struct b*bpointer;∥此处结构体虽然未定义,但是编译器却可以接受
};
struct b
{
int bfield;
struct a* apointer;
};
需要注意一个区别:结构体的自引用(self reference)就是在结构体内部,包含指向自身类型结构体的指针。结构体的相互引用(mutual reference)即在多个结构体中,都包含指向其他结构体的指针。
struct a
{
int b;
int c;
char d;
struct a z;
struct a *p;
}
上述结构有问题,因为结构中不能定义结构本身的非指针变量,如果编译器支持则会导致无限嵌套,因此一般编译器都会认为struct a是未定义的类型,即使提前声明也不会有任何用处。