日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言】结构体赋值

發布時間:2023/12/2 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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语言】结构体赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。