在数组中转换void类型指针

时间:2015-08-04 21:59:11

标签: c arrays pointers void

假设我有一个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

数组内容完全相同!谁能告诉我为什么?

2 个答案:

答案 0 :(得分:4)

  

然后将32位浮点类型数据分配给arrayHandle所在的内存   指向

*((float *)arrayHandle) = 1234.5678;

停在这里,你实际上正在打破严格别名规则,从而产生一个UB(所以任何事情都可能发生)。即使arrayHandle的类型为void *,它也来自myarray,它被声明为无符号整数类型。

在整数和浮点类型之间使用type punning的联合数组。

答案 1 :(得分:-1)

数组已经是指针,尝试使用void * arrayHandle = myarray;