在跟随 OpenGL 教程 时,我遇到了这段代码:
unsigned char header[54];
// [...]
unsigned int dataPos = *(int*)&(header[0x0A]);
我不理解使用*(int*)&
的用法。为什么不直接使用(int)
?
header
是一个 char
数组,这里的转换是将 header
在位置 0x0A
的地址转换成一个 int*
指针,然后从那个地址读取数据,就好像它是一个 int
。实际上,它将从位置 0x0A 开始读取头部的4个字节(或者一个int在你的系统上的大小),并将它们打包成一个单独的整数。
简单的 (int)
转换只会将在位置 0x0A
上的值从 char
转换为 int
,但不会获得其余3个字节上的值。
std::memcpy(&dataPos, header + 0xA, sizeof dataPos);
std::memcpy(&dataPos, &header[0xA], sizeof dataPos)
应该可以解决问题。 - mediocrevegetable1std::memcpy(&dataPos, &header[0xA], sizeof dataPos);
更安全且符合MISRA标准。 - Murat Ursavaş&header[0xA]
和 header + 0xA
是完全等价的,就我所知,它们之间没有更安全的一种。char 的定义总是恰好1个字节,永远不会超过。如果您的意思是当一个字节的大小不同于8位时可能会出现问题,那么&header[0xA]
也会有同样的问题。如果MISRA要求使用前一种风格,并且您需要符合MISRA,则请务必使用该风格,但这只是一种风格问题。 - eerorika*(int*)&(header[0x0A]);
的意思是首先将 &header[0x0A]
强制转换为 int*
以匹配 header
的类型,然后使用 *
解引用整个变量,使得结果不再是指针。
*(int*)&(header[0x0A])
看起来像是一个严格别名违规。 - mediocrevegetable1