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

2023-05-16

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

/* 节点结构体定义 */
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;

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

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

转载请附带本文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

轻松理解链表、物联网、uC/OS链表、FREERTOS链表 的相关文章

  • samba服务器

    samba服务器 install samba edit etc samba smb conf default comment 61 default path 61 opt es backups valid users 61 zsk13 wr
  • linux安装mongodb

    install mongodb tar zxvf mongodb linux x86 64 4 0 22 tgz useradd mongod init passwd with mongod passwd mongod mkdir for
  • linux制作iso启动盘

    制作iso启动盘 sudo fdisk l umount dev sdb umount dev sdb1 umount dev sdd2 umount dev sdd3 sudo mkfs ext4 dev sdb sudo dd if 6
  • ros2+opencv抓取rtsp视频流

    遇到的坑 xff1a rtsp视频流和转ros2 topic放到一个线程里 xff0c 频繁提示解码丢帧的情况 解决这个问题需要将opencv获取rtsp视频流单独开一个线程 xff0c 不能在里面处理任何多余的代码 代码如下 xff1a
  • 机械臂标定实战

    硬件资源 xff1a 机械臂viper300 摄像头realsense d435i 软件版本 xff1a 操作系统 xff1a Ubuntu18 04 ROS Melodic 标定算法 xff1a 采用easy handeye 算法包 ht
  • Linux 下的 Docker 安装及创建私有仓(三)

    Linux 下的 Docker 安装及创建私有仓 xff08 三 xff09 辛苦打工人 xff0c 今天继续搬砖 xff0c 搞搞私有仓用户和密码 废话不说 xff0c 开工 xff01 1 安装httpd tools 授权需要用到 xf
  • .Net Core Web API 发布到Linux Docker(一)

    Net Core Web API 发布到Linux Docker xff08 一 xff09 Net Core Web API 项目已经建好 xff0c 想要发布到Linux Docker 上 xff0c 具体研究了一下 xff0c 发现有
  • 设置mysql允许外网访问

    mysql的root账户 我在连接时通常用的是localhost或127 0 0 1 公司的测试服务器上的mysql也是localhost所以我想访问无法访问 测试暂停 解决方法如下 1 修改表 登录mysql数据库 切换到mysql数据库
  • .Net Core Web API 发布到Linux Docker(二)

    Net Core Web API 发布到Linux Docker xff08 二 xff09 本章将尝试 Net Core Web API 直接发布到私有仓 Net Core Web API 直接发布到Docker私有仓 1 选择需要发布的
  • .Net Core微服务入门——Consul集群搭建(一)

    Net Core微服务入门 Consul集群搭建 xff08 一 xff09 前几天一直在本地机器试用Consul xff0c 今天特意在服务器上试试 xff0c 并搭建下集群 一 服务器安装consul 获取镜像 docker pull
  • .Net Core微服务入门——Consul集群搭建(二)

    Net Core微服务入门 Consul集群搭建 xff08 二 xff09 1 先启动第一个consul服务 xff1a consul1 docker run name consul1 d p 8500 span class token
  • .Net Core微服务入门——Consul集群搭建(三)

    Net Core微服务入门 Consul集群搭建 xff08 三 xff09 本章将介绍 Consul 集群 Client 还记得第一篇中 xff0c 我们再Consul中启动了2个MyAPI服务么 xff0c 我们重启下 xff0c 看下
  • .Net Core微服务入门——Consul集群搭建(四)

    Net Core微服务入门 Consul集群搭建 xff08 四 xff09 多台服务器集群搭建 1 先关闭几台集群服务器防火墙 当然 xff0c 不关闭也可以 xff0c 那就必须开通端口权限 consul 涉及的端口 xff1a 850
  • Docker 同一主机容器间通信

    Docker 容器间通信 本文我们采用bridge网络通信 1 创建bridge网络 docker network create testnet 2 查看Docker网络 docker network ls 3 运行容器连接到testnet
  • Centos7端口查看开放,防火墙开启关闭命令等

    1 开放 关闭端口 开放5001端口 firewall cmd zone 61 public add port 61 5001 tcp permanent 关闭5001端口 firewall cmd zone 61 public remov
  • .Net Core微服务入门——Ocelot API网关接入(一)

    Net Core微服务入门 Ocelot API网关接入 上一章我们测试了一个简单的Client 端访问Consul实现服务注册与发现 xff0c 但是现实生产环境我们直接通过Client自行连接Consul实现服务注册与发现 xff0c
  • .Net Core微服务入门——Ocelot API网关接入(二)

    Net Core微服务入门 Ocelot API网关接入 xff08 二 xff09 我们先接入Consul xff0c 实现服务发现 服务发现 1 引入 Ocelot Provider Consul 包 2 修改ocelot json x
  • .NET Core根据环境变量支持多个 appsettings.json配置文件

    NET Core根据环境变量支持多个 appsettings json配置文件 在项目开发的过程当中 xff0c 开发环境 测试环境 生产环境的配置肯定是不一样的 xff0c 单靠一个 appsettings json xff0c 没法满足
  • (转)SQL Server 2008 允许远程连接的解决方法

    用户在使用SQL Server 2008远程链接时 xff0c 可能会弹出如下对话框 xff1a 在链接SQL服务器时发生网络链接错误或特定实例错误 SQL服务器不存在或者链接不成功 请验证用户名是否正确或SQL服务器是否已经配置远程链接功
  • .Net Core微服务入门——Ocelot和Consul集群高可用

    Net Core微服务入门 Ocelot和Consul集群高可用 上一章 我们ocelot网关顺利的接入了consul集群 并且访问成功 但是 我们也遇到了问题 把 192 168 8 25 上的consul停掉了 重新访问ocelot网关

随机推荐