假设我有一个 Uint 数组:Uint myarray[10]
。 Uint
是无符号的 16 位整数。
我还定义了一个 void
类型的指针,这样
void * arrayHandle = &myarray;
添加一些偏移量,使 arrayHandle
指向 myarray[3]
(在此处标记,将在另一个测试中更改偏移量)
arrayHandle = (Uint *)arrayHandle + 3;
然后在arrayHandle
指向的内存中分配一个32位的float型数据
*((float *)arrayHandle) = 1234.5678;
32位的1234.5678可以表示为两个16位的Uint原始数据,其中十进制高16位为21035,十进制低16位为17562。
毕竟,我去检查数组并找到 myarray[2] = 21035
和 myarray[3] = 17562
。
但是,当我返回更改偏移量时,arrayHandle
指向 myarray[2]
arrayHandle = (Uint *)arrayHandle + 2;
并进行类似的 float 赋值。我发现 myarray[2] = 21035
和 myarray[3] = 17562
。
数组内容一模一样!谁能告诉我为什么?
最佳答案
Then assign a 32 bit float type data to memory where arrayHandle points to
*((float *)arrayHandle) = 1234.5678;
到此为止,您实际上违反了严格的别名规则,从而产生了 UB(所以任何事情都有可能发生)。即使 arrayHandle
是 void *
类型,它也源自 myarray
,声明为无符号整数类型。
为 type punning 使用 union 数组介于整数和浮点类型之间。
关于在数组中转换 void 类型指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31820120/