【问题标题】:cast void type pointer in an array在数组中强制转换 void 类型指针
【发布时间】:2015-08-04 21:59:11
【问题描述】:

假设我有一个 Uint 数组:Uint myarray[10]Uint 是无符号 16 位整数。 我还定义了一个void 类型指针,这样

void * arrayHandle = &myarray;

添加一些偏移量,使arrayHandle 指向myarray[3](在此处标记,将在另一个测试中更改偏移量)

arrayHandle = (Uint *)arrayHandle + 3;

然后给arrayHandle指向的内存分配一个32位浮点型数据

*((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

数组内容一模一样!谁能告诉我为什么?

【问题讨论】:

  • 顺便说一句,你要做什么?也许你可以使用联合?
  • 你知道&myarray确实计算为Uint*类型的指针,计算为Uint (*)[10]类型的指针,不是吗?

标签: c arrays pointers void


【解决方案1】:

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

*((float *)arrayHandle) = 1234.5678;

到此为止,您实际上违反了严格的别名规则,从而产生了一个 UB(因此任何事情都可能发生)。即使arrayHandlevoid * 类型,它也源自myarray,它被声明为无符号整数类型。

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

【讨论】:

  • *((float *)arrayHandle) 也可能会破坏对齐要求。
【解决方案2】:

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

【讨论】:

  • 数组不是指针,它们衰减为大多数操作的指针。
  • 是的,如果您尝试打印&myarraymyarray,您将获得完全相同的地址。
猜你喜欢
  • 2018-03-05
  • 2014-04-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2016-08-29
相关资源
最近更新 更多