繁体   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