c++ - 通过指针偏移访问结构变量值
问题描述
我有一个结构,看起来像:
#pragma pack(1)
typedef struct WHEATHER_STRUCT {
uint8_t packetID; // Value 9
uint16_t packetSize; // Value 7
float cloudLayerAltitude; // Value 25000
} Wheather_Struct
该结构已正确初始化。由于算法的设计,我需要通过指针偏移来读取这三个属性值。我感谢声明一个数组,该数组具有这些属性的字节大小。就像:
int sizeOfStructAttributes = {1, 2, 4};
最后要访问这些值,请执行以下操作:
pointer = (*this->wheather_struct->packetID)
for (i=0; i<sizeof(sizeOfStructAttributes); i++)
cout << &pointer << ' ';
pointer = pointer + sizeOfStructAttributes[i];
预期结果:
9 7 25000
请问你能帮帮我吗?
解决方案
您的代码有很多问题,我将尝试全部解决:
1-您的结构具有填充值,这取决于您所针对的体系结构,可能在第一个成员(packetID)之后的 3 或 7 个字节,这取决于体系结构和编译器。
2-您以错误的方式初始化指针,它应该是:
pointer = &(this->wheather_struct->packetID);
3- cout 应该是:
cout << *((datatype*)pointer) << ' ';
//datatype should be different in each loop iteration of course.
4- 如果您正在创建此 strcutrue 的数组,我不确定您是否会遇到填充问题。当您使用不同的打包和填充时,由于将您的代码与使用不同编译器指令编译的其他库混合在一起,甚至在编译期间使用#pragma 修改编译器的行为,这种情况在极少数情况下会发生。
最后,我确信根本不需要用指针枚举结构成员。
我鼓励您阅读有关 struct padding and packing 的内容,这是一个很好的起点,关于 SO: Structure padding and packing
推荐阅读
- sql - 使用窗口函数 LAG() 时如何保留第一条记录?
- powershell - 使用 PowerShell 通过 SFTP 计算 ZIP 文件中的文件
- r - 滑块输入白小时闪亮
- javascript - Google Apps 脚本网络应用返回一个奇怪的错误
- python - 当减数为 None 时,Djano 使用减法操作进行注释返回 None
- flutter - Flutter_downloader Worker 结果在 Flutter 2.5.0 中工作失败
- javascript - 我可以在 Javascript 中使这段代码更清晰吗?
- ruby-on-rails - 在现有 rails 项目上安装 `cssbundling-rails` 后引用现有的 scss 资产
- sql - 如何查找日期范围内的出现次数?
- flutter - VS 代码无法连接到 Chrome 调试端口:37095