在数组中转换 void 类型指针

标签 c arrays pointers void

假设我有一个 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] = 21035myarray[3] = 17562

但是,当我返回更改偏移量时,arrayHandle 指向 myarray[2]

arrayHandle = (Uint *)arrayHandle + 2;

并进行类似的 float 赋值。我发现 myarray[2] = 21035myarray[3] = 17562

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

最佳答案

Then assign a 32 bit float type data to memory where arrayHandle points to

*((float *)arrayHandle) = 1234.5678;

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

type punning 使用 union 数组介于整数和浮点类型之间。

关于在数组中转换 void 类型指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31820120/

相关文章:

javascript - 如何使用 For Loop JavaScript 循环遍历每个条目

c - 是否可以将 char 指针分配给 float 值?

c - 预期的标识符 token '('

c - 使用c代码读取AT COMMAND输出?

c - 这是 `makefile` 在 C 中的正确实现吗?

c - 如果使用结构体或指针作为 C 中 if 语句的参数,如何确定 true 或 false 结果?

c++ - 递归取消引用指针

c - 0xfff 处的用户空间地址 <something>

java - 如何使用java打印数组在i和i+1索引处的索引?

arrays - 查找数组中的最大值,即其他 3 个值的总和