数据结构逆向分析-List

首先STL中的List就是一个链表,但是肯定C++用了很多封装,所以这里我们来一探究竟。

开始

首先先写一些简单的分析的源代码:

#include<iostream>
#include<list>
using namespace std;

int main()
{

list<int> MyList;
int SizeList = sizeof(MyList);
MyList.push_back(1);
MyList.push_back(2);
MyList.push_back(3);
MyList.push_back(4);
MyList.push_back(5);
MyList.push_back(6);
MyList.push_back(7);

return 0;
}

 

 

刚开始的List是有12个字节大小。然后通过内存来看一下:

 

 

还有这两个地址的内容:

 

 

我们画个图来展示就很清楚了:

 

 

目前就是这个情况,我们来添加一个List之后再看看:

(使用 MyList.push_back(1);之后):

 

 

其实说这样就可以猜到一些内容了,首先这个0121818可能是一个没啥用的东西就是和List这个东西互相指着,因为啥也没改变,然后0121e888这个字段应该是指向了链表的头指针,然后这个链表应该是一个双向循环链表。有学过链表的应该会和我猜的差不多,那么继续往下看:

    MyList.push_back(2);

就成了这样子:

 

 

就很明显了,第一个0121E888这个链表头两个指针,一个指向头,一个指向尾,然后剩下的是一个循环链表。

再往下搞一个:

    MyList.push_back(3);

 

 

画图后就一清二楚了。

 

小结

内存是C/C++的核心,一步一步慢慢分析就好了。