将一个结构转换为另一个结构以获取特定数据

标签 c casting struct

我有这个代表通用消息的结构

typedef struct {
    uint16_t length;    
    uint8_t type1;      
    uint8_t type2;      
    uint8_t *data;      
} generic_msg_t;

读完 type1 和 type 2 后我可以知道它对应的是哪条具体消息,例如这个:

 typedef struct {
     uint16_t length;   
     uint8_t type1;     
     uint8_t type2;     
     uint16_t a;
     uint8_t b;
     uint8_t c;
     double d;
     double e;
     double f;
     double g;
     double h;
     uint8_t i;
 } specific_msg_t;

假设 msg 包含经过验证的数据,我想了解为什么如果我这样做,我无法访问 d、e、f、g、h 数据(但也可以访问 a、b、c)

specific_msg_t * specific_msg = (specific_msg_t *) msg;
uint16_t a = specific_msg->a; //OK
double d = specific_msg->d; //NOK`

我必须这样做:

unsigned char * buffer = (unsigned char *) msg;
double d = buffer[15] + (buffer[14] << 8) + (buffer[13] << 16) + (buffer[12] << 24) + (buffer[11] << 32) + (buffer[10] << 40) + (buffer[9] << 48) + (buffer[8] << 56);`

最佳答案

special_msg_tgeneric_msg_t 具有潜在不同的对齐要求,因此在某些架构上,该代码可能会导致崩溃 - 编译器没有特殊要求来对齐 generic_msg_t 对象适合访问 double 的边界。

这将有助于准确了解您遇到的错误。

关于将一个结构转换为另一个结构以获取特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150631/

相关文章:

c - 如何以相反的顺序打印二维字符串数组

c - 将一个字符分配给一个字符串

sql - 如何连接表行中的所有结果?

c++ - 指向基类的成员指针

c - 访问函数中的结构元素

c - Raspberry Pi 上 cat 和 grep 之间的管道损坏

c - 复制矩阵的最后一个元素

java - Java 中 int 的范围错误

c - 为什么我们不能在文件范围内 typedef 一个(未命名)结构两次,但我们可以 typedef "int"两次而不会出现错误?

c - 检查数据结构中的值是否等于 NULL 如何返回段错误?