【C语言】结构体赋值
結構體在 C 程序中使用的較為頻繁,能對數據有一定的封裝的作用。對一個結構體賦值時,經常采用的方式是,分別對其成員變量賦值。那么能否將一個結構體用賦值號(“=”)直接賦值給另一個結構體呢?網上的答案不一,有說可以的,有說不可以的,有說這樣的話兩個結構體共用一塊內存空間。我們可以從匯編語言的角度來看這個問題,測試程序:
//test.c
#include
int?main() { ? ?struct?foo ? ?{ ? ? ? ?int?a; ? ? ? ?
???????????? int?b[5]; ? ? ? ?
? ???? ?????int?*c; ? ?} x, y; ? ?x.a = 666; ? ?x.b[0] = 555; ? ?x.c = NULL; ? ?y = x; ? ?
????return?0; }
程序定義了結構體 foo,它有3個成員變量:int 型數據 a、int 數組 b、int 指針 c,以觀察是否對不同類型的成員有不同的處理。使用 gcc 將其編譯:
gcc -S -masm=intel test.c
編譯時并沒有報錯,說明編譯器接受這種賦值方式,但賦值時具體發生了什么?打開其輸出的匯編文件,關鍵部分為:
mov?? ? DWORD PTR [esp 36], 666
mov?? ? DWORD PTR [esp 40], 555
mov?? ? DWORD PTR [esp 60], 0
lea ? ? edx, [esp 8] lea ? ? ebx, [esp 36]
mov?? ? eax, 7
mov?? ? edi, edx
mov?? ? esi, ebx
mov?? ? ecx, eax rep movsd
前面3條 mov 語句為給成員變量賦值的語句;中間兩條 lea 語句得到了兩塊內存空間的偏移地址,第一塊為新的內存空間,第二塊為結構體 x 占有的內存空間;后面4條 mov 語句,第1、4條作用為把7賦給 ecx,第2條為把新內存空間地址賦給 edi,第3條為把 x 內存空間地址賦給 esi。關鍵在于最后一條語句:rep movsd。?
movsd 是一個串傳送指令,其英文為 move string dword,具體作用為以 esi(Source Index)為源地址,以 edi(destination Index)為目的地址,將源地址處一個雙字(dword)內容復制到目的地址。然后根據方向標志位 DF 的值,DF = 0,esi 與 edi 自增4,DF = 1,esi與edi自減4(dword 占用4個字節)。(但此處并沒有使用 CLD 設置 DF 值,默認為0?)rep 可以根據 ecx 的值,重復執行 ecx 次 movsd 指令。?
這樣的話,rep movsd 指令的作用是,將 esi 處的7個 dword 復制到 edi 處,而 foo 結構體正好占用4*7個字節(此處沒有對齊的問題)。于是,x 的內容便被復制到了另一塊相同大小的內存中,我們基本可以確定,這塊空間就是 y 所占的空間。?
因此,我們可以得出結論,結構體可以直接賦值,且賦值的結果是將賦值號左邊的結構體中的內容原原本本的
?
來源:http://blog.csdn.net/imred/article/details/45588477
總結
以上是生活随笔為你收集整理的【C语言】结构体赋值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言变量定义和赋值
- 下一篇: C |格式化输出与变量类型