freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

数据结构-堆中的单链表
星云博创 2021-10-20 14:33:51 106150

0x0:前言

在ctf中的pwn中,很多堆题都是考察对链表的了解情况,有时候考察单链表,有时候考察双链表。此篇文章说明了对于单链表的分析,并分析了数据区和指针区在结构体中是如何书写的。

1:链表

存储区域:堆区

链表不需要连续空间v2-f11c8abb55b327ed3d0ea425c5824856_1440w.png

2:链表特点

链表成员除了存储自身的数据之外,还需要存储下一个成员的地址,每个成员都可以通过地址找到下一个。

链表不需要提前声明好空间大小,只要运行内存足够大,链表就会无限延伸。

3:链表模型组成

v2-dedb1dcc639b070537f8bdaa706b70ad_1440w.png


节点:链表中是由若干个个体组成的,而这些个体,我们称之为节点。

头节点:排在链表最开头的节点称之为头节点。在头节点中,数据域无效。

头节点数据域做索引。

数据域:存储自身的数据。数据域中可以存储:内置数据类型、指针、数组、结构体。

指针域存下一个节点的地址。

如何在程序中表示一个节点?

一个节点又有数据域、同时也存在指针域,最好用结构体来表示。

例子:设计一条链表,每一个节点都是存储int类型的数据,分别存储10,20,30,把链表的实现过程写出来。v2-d685b04c470a014649e6089d7065e51d_1440w.png

4:单链表中的尾插

v2-fb6f328c280c656feb2416ab009b4b8c_1440w.pngv2-47acb6741df39d5eeae6c36ba07345ab_1440w.pngv2-e886a86c868484dbe96ffa95212dbe3c_1440w.pngv2-1b4dc64b246f36cd40b5fc5e4826c83f_1440w.pngv2-32a397ed932d37f706146ee177b8a862_1440w.png

//设计节点 struct list_node {int data;//数据域 struct list_node *next;//指针域 };struct list_node *head = init_list_head();{//申请一个头节点 struct list_node *head = malloc(sizeof(struct list_node));if(head ==NULL){printf("malloc head err\n")}//头节点的数据域与指针域赋值 head ->next =NULL;return head;} //定义一个新的节点 intsert_node_to_tail(struct list_node *head,int sum){//为新节点申请空间 struct list_node *new = malloc(sizeof(struct list_node));if(new ==NULL){printf("malloc new code err\n"); }new->data=num;//text 的值 new->next=NULL;//next指针 //寻找最后一个节点 struct list_node *p=NULL;for(p=head;p->next!=NULL;p=p->next);//从循环出来,必定是p->next一定NULL,这时候p一定指向最后一个节点。只需要将最后一个节点指针域指向新节点p->next =new;return 0; } void show_list_node(struct list_node *head){struct list_node *p = NULL;for (p=head;p->next!=NULL;p=p->next){printf("data:%d\n",p->next->data);}} int main(int argc,char *argv[]){//初始化链表的头节点 struct list_node *head = NULL;head = init_list_head();//链表尾部插入数据 intsert_node_to_tail(head,10);intsert_node_to_tail(head,20);intsert_node_to_tail(head,30);show_list_node(head); return 0; }

5:单链表中头插

v2-3b3c7e4cb839bcc0ad418873558ef0b5_1440w.png

6:小结

在链表中最重要的还是指针,所以对数据结构的掌握还是非常重要的。在c语言中,指针具有无比重要的地步。

# 堆 # pwn
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 星云博创 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
星云博创 LV.7
星云博创科技有限公司
  • 96 文章数
  • 76 关注者
【技术分享】记某项目漏洞挖掘
2024-01-16
【技术分享】短信验证码的相关利用方法与技巧
2023-11-23
【技术分享】业务逻辑漏洞案例剖析
2023-10-18
文章目录