轻松理解链表、物联网、uC/OS链表、FREERTOS链表

6 篇文章 1 订阅
3 篇文章 2 订阅

先给出链表所用结构体定义:

/* 节点结构体定义 */
struct xLIST_ITEM
{
	TickType_t xItemValue;             /* 辅助值,用于帮助节点做顺序排列 */			
	struct xLIST_ITEM *  pxNext;       /* 指向链表下一个节点 */		
	struct xLIST_ITEM *  pxPrevious;   /* 指向链表前一个节点 */	
	void * pvOwner;					   /* 指向拥有该节点的内核对象,通常是TCB */
	void *  pvContainer;		       /* 指向该节点所在的链表 */
};

关于此结构体,无论小白还是大牛,必须首先清楚的是该结构体里面定义了一个结构体指针,对于大牛来说坑定没啥问题,但是小白们看了就再脑子里面开始想了,结构体指针,那就是结构体里面定义了一个他自身的结构体,这咋跟回调函数差不多呢?还是说这是无穷无尽的结构体呢?这啥呀这是,小白直接蒙了。。。显然,都不是,这叫结构体的自身引用,下面给出一些相关知识及其代码:

1. 自引用结构体

错误的方式:

//错误的方式:
struct tag_1{
    struct tag_1 A;  
    int value;
};

重要的事情说三遍,这是错误的定义方式,这是错误的定义方式,这是错误的定义方式

因为这种声明实际上是一个无限循环,成员A是一个结构体,A的内部还会有成员是结构体,依次下去,无限循环。在分配内存的时候,由于无限嵌套,也无法确定这个结构体的长度,所以这种方式是非法的。

正确的方式: (使用指针)

struct tag_1{
    struct tag_1 *A; 
    int value;
};

        由于指针的长度是确定的(在32位机器上指针长度为4),所以编译器能够确定该结构体的长度。

可以这样理解,你新建了一个EXCEL表格,这个表格名字叫xLIST_ITEM,表格里面有两个内容,一个内容是int型的value,另一个内容是一个地址,这个地址取指(区分取值,如果是取值则是这个地址本身,取指,就是这个地址所指向的地方)是另一个跟你新建的这个表格一模一样的一个表格。这个一模一样的表格内容同样存放这两个内容,理解到这里,你可能会说这不又无穷无尽了吗,显然不是的,下面给出代码和运行代码所得结果:

/* 节点结构体定义 */
struct xLIST_ITEM
{
	TickType_t xItemValue;             /* 辅助值,用于帮助节点做顺序排列 */			
	struct xLIST_ITEM *  pxNext;       /* 指向链表下一个节点 */		
	struct xLIST_ITEM *  pxPrevious;   /* 指向链表前一个节点 */	
	void * pvOwner;					   /* 指向拥有该节点的内核对象,通常是TCB */
	void *  pvContainer;		       /* 指向该节点所在的链表 */
};
typedef struct xLIST_ITEM ListItem_t;  /* 节点数据类型重定义 */



/* 定义节点 */
struct xLIST_ITEM  List_Item1;

void vListInitialiseItem( ListItem_t * const pxItem )
{
	/* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
	pxItem->pvContainer = NULL;
}


int main(void)
{	
    /* 节点1初始化 */
    vListInitialiseItem( &List_Item1 );
    List_Item1.xItemValue =sizeof(struct xLIST_ITEM  );

}

运行的到的结果如下图:

 

 显然这是一个空节点,空节点的地址为:0x2000 0018 

该空节点成员所指向的地址为:0x0000 0000 

然后再看箭头所指向的内容,小白们切记,这些箭头所指向的内容都是一些计算机随机产生的随机数,可能也许或许有什么规律,但是跟你没关系!!小白切记,你们只需要知道这些内容你们并没有初始化他也就是将他们置零!

需要我们关心的就一个:List_Item1.xItemValue =sizeof(struct xLIST_ITEM  );即链表的大小:0x0000 0014----------------------这是多大?14个字节(Bytes)吗??显然不是!!是20个字节,0x代表的是16进制数,化成10进制也就是20,即此链表的大小为20Bytes;

至此,关于链表,应该很清楚了,持续关注一下博主,后续再整理一份关于链表的应用发给大家,

写文章不易,记得一键三连

转载请附带本文链接!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰俠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值