晚上学习简单的led驱动程序编写的时候看到链表的实现。在结构体中再一次定义了这个结构体类型的成员,当时感觉这么用什么时候能引用到头,这个结构体怎么结束,带着疑问百度了一下,结果找到了答案,是自己看的太粗心,没有细心看。
结构体作为一种类型,起成员可以是各种基本类型,当然也包括结构体这种类型。当一个结构体中想引用自身的结构时,是可以的,不过要注意用法。下面第一种是错误的,即我刚开始想象的那样子。第二种是正确的。
- 1.结构体定义中错误的自身引用:
- struct A {
- int a;
- int b;
- A c;
- }pp;
为什么错误呢,这个大家应该可以想象,第三个成员c是个A类型,c的第三个成员也是个A类型,那么会一直有pp.c.c.c.c.c.c.c……,此结构体的大小没有结束,那么肯定是错误的,编译的时候肯定通不过。那么怎么能是引用自身呢,这就要看指针的功能了。
- 2.结构体定义中正确的自身引用
- struct A{
- int a;
- int b;
- A *c;
- }pp;
这样使用指针指向一个自身的结构体,那么第三个元素是个指针,占用一个地址空间的大小,那么pp的大小就是一个int,一个int,再一个指针的大小。c的具体内容需要在实际用的时候去赋值。这样就达到了自身引用的效果。而操作系统中使用的链表的实现也就是这样来的:
- struct list_head {
- struct list_head *next, *prev;
- };
- struct device{
- ……
- struct list_head list;
- ……
- }
假设在32位机器上,list_head的大小占用8字节,共存储两个指针,分别指向他的前一个节点和后一个节点。
在学习操作系统的过程中,能够学到很多c语言的精髓所在,特别是对指针的使用,所以后面还是要多看多读代码,让自己的快速的提升。