簡體   English   中英

在數組中強制轉換類型指針

[英]cast void type pointer in an array

假設我有一個Uint數組: Uint myarray[10] Uint是無符號的16位整數。 我還定義了一個void類型指針

void * arrayHandle = &myarray;

添加一些偏移量,以便arrayHandle指向myarray[3] (在此處標記,將在另一個測試中更改偏移量)

arrayHandle = (Uint *)arrayHandle + 3;

然后將一個32位浮點類型數據分配給arrayHandle指向的內存

*((float *)arrayHandle) = 1234.5678;

32位1234.5678可以表示為兩個16位Uint原始數據,其中十進制的高16位為21035,十進制的低16位為17562。

畢竟,我去檢查數組並找到myarray[2] = 21035myarray[3] = 17562

但是,當我返回更改偏移量時, arrayHandle指向myarray[2]

arrayHandle = (Uint *)arrayHandle + 2;

並進行類似的浮動分配。 我發現myarray[2] = 21035myarray[3] = 17562

數組內容完全相同! 誰能告訴我為什么?

然后將一個32位浮點類型數據分配給arrayHandle指向的內存

 *((float *)arrayHandle) = 1234.5678; 

到此為止,您實際上正在打破嚴格的別名規則 ,從而產生了一個UB(因此可能發生任何事情)。 即使arrayHandle的類型為void * ,它也源自myarray ,它被聲明為無符號整數類型。

使用聯合數組在整數和浮點類型之間進行類型修剪

數組已經是一個指針,請嘗試使用void * arrayHandle = myarray ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM