因為今天看的代碼中用到了結構體的強制類型轉換,就很想了解一下結構體的強制類型轉換是怎樣的。
一個結構體如下:
在下面這段代碼中rbuf->reqCmdBuf是一個空指針,首先將這個空指針賦值給一個uint8_t類型的指針buf。
然後將buf指針強制類型轉換為rdma_write_msg_head結構體類型指針。
那再這裡是怎麼轉換的呢?
首先,將buf指針指向的內容的前8個字節賦值給rdma_write_msg_head結構體的rwmh->len變量,然後再
將緊接著的1個字節的內容賦值給rwmh->flag。至於buf指針指向的內容中前9個字節後的內容,我認為會被捨棄掉。
在查詢強制類型轉換的資料時,看到了這樣一個例子:
將一個十六進制的數賦值給一個整型變量,然後試圖將這個整型轉換為浮點型。
1、首先直接對整型強制類型轉換得到的結果為1112539136.000000.如果是對整型變量的地址進行轉換,結果則不同。
2、可以看到,下圖中是對整型變量a的地址進行強制類型轉換,得到的結果為52.000000.
總結:
為什麼方法1和方法2得到的結果不同呢?
總結原因,可以這樣認為:
在方法1中,直接對整型變量a進行類型轉換,那麼會先將十六進制數作為整型處理,也就是1112539136,
將1112539136強制轉換為浮點型,那麼得到的結果就是1112539136.000000.
而在方法2中,將整型變量a的地址轉換為浮點型的,那麼要將變量a地址中的內存值轉換為浮點型,就是將
原地址值中的十六進制數按照浮點型的格式解釋,從而得到結果52.000000.
PS.在測試實驗的過程中,犯了一個簡單的錯誤,從而得到了下面的問題:
在試圖輸出浮點型指針b的指針時,直接printf("%f",b);得到的結果為0.00000.
所以修改代碼為printf("%f",*b);得到了結果52.000000.但是如果保留printf("%f",b);會再一次輸出結果52.000000
一開始我以為這是codeblocks的編譯器進行了緩存做了什麼優化。但是在VC++編譯器中運行這段代碼得到了不同的結果。
在VC++中,同時出現printf("%f",*b);和printf("%f",b);輸出的結果分別是52.00000和0.00000;所以這有可能是編譯器的問題。