為檢驗vc預設設定下結構的對齊情況,特定義結構如下:
1: typedef struct _ctest
2: ctest,*pctest;
9: getdata()函式返回上面定義的結構,由此可觀察 c 語言中返回結構時的細節
10: ctest getdata()
11:
0040104a |. 8be5 mov esp,ebp
0040104c |. 5d pop ebp
0040104d /. c3 retn
0040104e cc int3
0040104f cc int3
21:
22: int main()
23:
0040109f |. 8be5 mov esp,ebp
004010a1 |. 5d pop ebp
004010a2 /. c3 retn
結論:c 語言中函式返回結構體時如果結構體較大, 則在呼叫函式中產生該結構的臨時變數,並將該變數首位址傳遞給被呼叫函式,被呼叫函式返回時根據該位址修改此臨時變數的內容,之後在呼叫函式中再將該變數複製給使用者定義的變數,這也正是 c 語言中所謂值傳遞的工作方式。
如果結構體較小, 則函式返回時所用的臨時變數可儲存在暫存器中,返回後將暫存器的值複製給使用者定義的變數即可。
測試環境及工具:
vc++.net 7.1 realease 版本;禁止優化
ollydbg v1.10
附:測試所用的 c 語言**:
typedef struct _ctest
ctest,*pctest;
ctest getdata()
int main()
c語言結構體分析
是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構體。個人覺得結構體就是乙個資料型別的擴充 更具有綜合性 普遍性 適用性,因為目前階段的發展,簡簡單單的數字 字元已經很難滿足目前的資料需求,為了滿足這個需求,結構體出現了。例1 struct mail 宣告乙個名字為mail的結構體,結構...
關於返回結構體的函式
本文的範例 取材於 彙編中函式返回結構體的方法 一文,並在此基礎上進行修改和試驗。要研究的第乙份 如下,定義乙個不超過 8 bytes 的小結構體,不超過 8 bytes 是因為這個結構體能夠用 edx eax 容納,我們之後將看到在 release 編譯時,編譯器能夠向返回普通基礎型別那樣進行返回...
c 函式返回結構體陣列的神奇之處
眾所周知,如果我們想用函式返回乙個陣列,那麼我們應該用new來分配記憶體,而不是單純地申明陣列區域性變數,否則函式體結束後區域性變數被釋放,陣列也就丟失了 申明區域性變數 int test0 return a 用new分配記憶體 int test1 return a 列印兩種申明方式地結果 intm...