資料結構逆向分析-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++的核心,一步一步慢慢分析就好了。