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