c++中分配內存

1.在c++中是喲個new和delete來分配內存。比如char *p=new char [len+1];(對於字符串來說,一定要記得最後有個null,長度要足夠長才行)。

另外,使用c++new返回的指針不能用來進行解引用操作,因爲它畢竟沒有指向任何元素。允許的操作包括比較運算。可以令定義一個指針來指向它,但是它本身不能被引用。

對於string來說,它內部提供了一個c_str函數,用於返回c風格的字符串,其字面意思是:“返回C風格字符串的表示方法”,即返回指向字符數組首地址的指針,這個指針的類型是const char類型的,所以當定義時必須使用如下方式:const char *str=st.c_str();

2.利用數組來初始化vector對象,比如:

const size_t arr_size=6;

int int_arr[arr_size]={0,2,3,4,5,6};

vector<int> ivec(int_arr,int_arr+3);//把int_arr的元素賦給ivec,此種方式賦給容器的值是數組的子集。

3.注意vector的迭代器的特殊用法:假如使用for循環,初始化一個vector的迭代器,那麼不能再聲明或初始化其他類型的變量,否則會出錯。例如

for(int *q=p,vector<int>::iterator ia=ivec.begin();ia!=ivec.end();ia++)//這裏不能同時定義指針q和迭代器ia,否則會出錯

.....;

4.創建字符型指針數組:用new創建字符指針數組,char **p=new char *[len];

對於用delete刪除新創建的緩衝區時,如果此指針並未被賦值,則會出錯,也就是說去刪除一個不存在的緩衝區即該指針未初始化,會出現運行錯誤。

5.多維數組以及其指針

int ia[3][4];

int (*ip)[4]=ia;//ip指向一個包含4個int元素的指針,此時指向第一維的4個元素

ip=&ia[2];//指向第三維的四個元素

聲明指向數組的指針時其括號是必要的,否則會出現下列區別:

int *p[4];//一個int型指針的數組

int (*p)[4];//指向具有4個int型元素的數組

6、

打開了一個記事本,在裏面輸入一個‘hello world’,假設它在記事本進程中的地址爲addr1:0x4000100,那麼現在我需要在一個驅動程序中直接取addr1中的數據,比如mov eax,[addr1];問該怎麼做才能取到數據?

用戶態的地址會隨着進程的切換而訪問到的數據不同,所以直接對此地址訪問,取到的數據不會是預期的進程中的數據;一個蠢辦法,說直接把所有的線程掛起,然後喚醒這個記事本進程

CR3是存放一個進程的頁目錄地址的寄存器,對用戶態的地址訪問都要通過它來進行轉換,所以相同的虛擬地址通過它做轉換後就變成了不一樣的物理地址。

由此想到,在每一個進程的EPROCESS中,都有一個指針,指向此進程的頁目錄地址,如果強制把它賦給CR3不久可以訪問特定進程的用戶態數據了麼

首先,在內核態遍歷所有進程,找到對應的記事本進程,保存當前CR3中的值,然後替換爲目標進程(記事本)的頁目錄地址,然後mov eax,[addr1];即可,訪問完畢後,再把原來的保存的CR3值寫入CR3寄存器,問題解決



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章