假设我有一个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] = 21035
和myarray[3] = 17562
。
但是,当我返回更改偏移时arrayHandle
指向myarray[2]
arrayHandle = (Uint *)arrayHandle + 2;
并执行类似的浮动分配。我发现myarray[2] = 21035
和myarray[3] = 17562
。
数组内容完全相同!谁能告诉我为什么?
答案 0 :(得分:4)
然后将32位浮点类型数据分配给arrayHandle所在的内存 指向
*((float *)arrayHandle) = 1234.5678;
停在这里,你实际上正在打破严格别名规则,从而产生一个UB(所以任何事情都可能发生)。即使arrayHandle
的类型为void *
,它也来自myarray
,它被声明为无符号整数类型。
在整数和浮点类型之间使用type punning的联合数组。
答案 1 :(得分:-1)
数组已经是指针,尝试使用void * arrayHandle = myarray
;