C 語言函式返回結構體彙編分析

2021-04-07 04:17:18 字數 953 閱讀 6130

為檢驗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...