首页 > 解决方案 > 通过指针偏移访问结构变量值

问题描述

我有一个结构,看起来像:

#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

请问你能帮帮我吗?

标签: c++pointersstruct

解决方案


您的代码有很多问题,我将尝试全部解决:

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


推荐阅读