在数组中转换 void 类型指针
cast void type pointer in an array
假设我有一个 Uint 数组:Uint myarray[10]
。 Uint
是无符号的 16 位整数。
我还定义了一个 void
类型的指针,这样
void * arrayHandle = &myarray;
添加一些偏移量,使 arrayHandle
指向 myarray[3]
(在此处标记,将在另一次测试中更改偏移量)
arrayHandle = (Uint *)arrayHandle + 3;
然后分配一个32位的float型数据到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
.
数组内容一模一样!谁能告诉我为什么?
数组已经是指针,尝试使用void * arrayHandle = myarray
;
Then assign a 32 bit float type data to memory where arrayHandle
points to
*((float *)arrayHandle) = 1234.5678;
到此为止,您实际上违反了严格的别名规则,从而产生了一个 UB(所以任何事情都有可能发生)。即使 arrayHandle
是 void *
类型,它也源自 myarray
,即声明为无符号整数类型。
对整数和浮点类型之间的 type punning 使用联合数组。
假设我有一个 Uint 数组:Uint myarray[10]
。 Uint
是无符号的 16 位整数。
我还定义了一个 void
类型的指针,这样
void * arrayHandle = &myarray;
添加一些偏移量,使 arrayHandle
指向 myarray[3]
(在此处标记,将在另一次测试中更改偏移量)
arrayHandle = (Uint *)arrayHandle + 3;
然后分配一个32位的float型数据到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
.
数组内容一模一样!谁能告诉我为什么?
数组已经是指针,尝试使用void * arrayHandle = myarray
;
Then assign a 32 bit float type data to memory where arrayHandle points to
*((float *)arrayHandle) = 1234.5678;
到此为止,您实际上违反了严格的别名规则,从而产生了一个 UB(所以任何事情都有可能发生)。即使 arrayHandle
是 void *
类型,它也源自 myarray
,即声明为无符号整数类型。
对整数和浮点类型之间的 type punning 使用联合数组。