• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

嵌套结构体指针内的指针成员

单片小白 2021-12-29 浏览量:329
// 数据帧结构体定义
#pragma pack(push 1)
typedef struct
{
    uint8_t cmd;
    uint8_t param;
    void *data;
}info_t;
typedef struct
{
    uint16_t head;
    uint8_t addr;
    uint8_t index;
    uint8_t size;
    uint8_t sep;
    info_t info;
    uint16_t crc;
    uint32_t tail;
}comm_frame_t;
#pragma pack(pop)

// 假设frame_buf是接收到的数据
static uint8_t frame_buf[] = {0xee 0x7e 0x02 0x03 0x04 0x55 0x06 0x70 0x29 0x12 0x21 0x20 0x07 0x21 0xff 0xff 0xfc 0xff};

// 想使用如下方式进行简单快速的解包
void unpack(void)
{
    comm_frame_t *frame = (comm_frame_t *)frame_buf;
    frame->info.data = &frame_buf[9];
    printf("head:0x%04X " frame->head);
    printf("my_addr:0x%02X " frame->my_addr);
    printf("aim_addr:0x%02X " frame->aim_addr);
    printf("index:0x%02X " frame->index);
    printf("size:%d " frame->size);
    printf("sep:0x%02X " frame->sep);
    printf("cmd:0x%02X " frame->info.cmd);
    printf("param:0x%02X " frame->info.param);
    printf("data:0x%X.\r\n" *(uint32_t *)(frame->info.data));    
}

问题:
1、其他成员都正常,在索引信息段内的data时 *(uint32_t *)(frame->info.data)出错,得到的结果貌似是一个地址;
2、单独直接使用 value = *(uint32_t *)&frame_buf[9]肯定没问题,但加上 frame->info.data = &frame_buf[9]; 再执行前者得到的结果和上一条相同;
百思不得其解,请大佬指教
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • *(uint32_t *)(frame->info.data) 的用法都是错误的,

    根据前面的程序,

    frame->info.data 是指向 comm_frame_t 结构的指针,而不是普通的uint32_t 类型 的指针

    后面的处理其实都是有问题的。


    • 发布于 2021-12-30
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:1

相关问题

问题达人换一批

嵌套结构体指针内的指针成员