結構體的強制型別轉換
阿新 • • 發佈:2019-01-08
之前在寫記憶體注入的時候,尋找IAT表都是手動計算的,後來發現可以直接用結構體,在結構體的賦值那裡不是很懂,於是便寫了個簡單的程式來測試
測試程式碼 :
/////////////////////////////////////////////////////////////////////////////
// 檔名 : test.c
// 工程 : test
// 作者 : enjoy5512 修改者 : enjoy5512 最後優化註釋者 : enjoy5512
// 個人技術部落格 : blog.csdn.net/enjoy5512
// 個人GitHub : github.com/whu-enjoy
// csdn code : code.csdn.net/enjoy5512
// 描述 : 測試結構體的賦值操作
// 主要函式 :
// 版本 : 最終確定版 完成日期 : 2016年5月30日 21:35:18
// 修改 :
/////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
int main(void)
{
unsigned char a[] = "0123456789abcdefghijk"; //無符號字元陣列
struct A //結構體A,一個int 三個char 再接一個int
{
int a;
char b;
char c;
char d;
int e;
}p,*pp;
struct B //結構體B,一個int 一個 char 在接一個int
{
int a;
char b;
int c;
};
p.a = 1; //結構體A p的初始化
p.b = '2';
p.c = '3';
p.d = '4';
p.e = 5;
pp = &p; //將結構體p賦值給pp
pp = a; //用陣列a來給結構體pp賦值
pp = (struct A *)a; //強制型別轉換用陣列a給結構體pp賦值
pp = (struct B *)a; //強制型別轉換成結構體B再給pp賦值
return 0;
}
程式碼測試結果
當程式執行到 pp = &p
時,p都被初始化了,pp是一個指標,沒有分配空間,所以所有的指標為空 :
當程式執行到 pp = a
時,可以看到,pp指向了p這個結構體,內容與p一樣
當程式執行到 pp = (struct A *)a
時,pp指向了陣列a,而pp指向的結構體內容則是a陣列元素順序賦值的結果, 後面的 pp = (struct B *)a
執行之後pp指向的結構體都一樣,從這裡可以看出,結構體的內容其實就是成員變數在記憶體中順序存放,不管顯示轉換還是隱式轉換,結果都是一樣的..不過還是建議大家用顯示轉換,這樣可以讓編譯器和別人知道你將某個記憶體裡的東西轉換成什麼了
細心的人可能發現了,將a賦值給結構體pp後,a中的元素7不在了,我們來看一下pp指向的結構體的各個成員變數的地址,可以看到e與d之間還有一個位元組的記憶體沒用,這是因為我電腦是32位系統,結構體在賦值的時候,會對變數進行記憶體4位元組(32位)對齊操作..其他的變數在定義的時候也是這樣會記憶體對齊,所以大家在定義結構體的時候,要注意各成員變數的空間大小哦,這樣可以省下不少記憶體空間呢