我有这样的结构:
typedef union{
uint16_t word[32];
struct{
uint8_t Ho[32];
uint8_t Lo[32];
};
} _DIO_MIN;
typedef union{
uint16_t word[128];
struct{
uint8_t Ho[128];
uint8_t Lo[128];
};
} _DIO_MID;
typedef union{
uint16_t word[4096];
struct{
uint8_t Ho[4096];
uint8_t Lo[4096];
};
} _DIO_MAX;
typedef struct DIO{
unionDio DIO00;
_DIO_MIN DIO_MIN[63];
_DIO_MID DIO_MID[32];
_DIO_MAX DIO_MAX[4];
float GLOB[8192];
uint16_t ASUIO[32768];
uint8_t LOCALL[32768];
float STATDATA[32768];
char ERRORS[80];
int READYINPUT;
char DISP1[2][30][95];
char DISP2[2][30][95];
char DISP3[2][30][95];
char DISP4[2][30][95];
} _SysMem;
extern _SysMem SYSMEM;
我想通过指针逐字节访问结构的字段。为此,我这样做:
uint8_t *addrSYSMEM = NULL;
addrSYSMEM = (uint8_t*)&SYSMEM;
SYSMEM.GLOB[0] = 16;
float a = *(addrSYSMEM + 45056);
但在“a”中为零。我不知道我错在哪里。
首先不要忘记改变指针的类型。同样在结构中,您首先需要找出元素的位置。它始终由编译器排序,并添加空格(aligns)。
查找字段偏移量:
然后
float
可以得到第一个:这还不是全部。字节访问与编译器优化冲突。它可以删除所有“不必要的”赋值并且不读取新值,因为它认为没有任何改变。所以总是做一个变量
volatile
。在您的情况下,使用静态混合将是一种较差的便携方式。尝试检查混合的正确性。
问题是它可能在您的机器上(以及在我的机器上),机器字中的字节顺序位于Little Endian。
如您所见,第一个字节等于零,因此从您那里获取相同的零,因为。你输入cast
uint8_t
tofloat
aka((float)((int8_t)0)) ~~ .0f
,但float
它是 4 个字节的集合。但是如果你按照我留下的评论中的例子,那么可以清楚地看到,当将一个类型转换为原始类型时,编译器会正确理解它的维度,它不会复制指针中的第一个字节
int8_t
,但是sizeof(float) == 4
。在开放空间阅读更多内容。