【发布时间】:2017-10-31 12:39:42
【问题描述】:
如何让变量指向不同结构的成员?这是我正在尝试做的,但是第三行失败了。
volatile uint8_t tx_message_buffer[sizeof(MESSAGE)];
struct MESSAGE *tx_message = (MESSAGE *)tx_message_buffer;
struct PAYLOAD *tx_payload = (PAYLOAD *)tx_message->payload;
这是结构定义。
#define MSG_MAX_PAYLOAD_LENGTH 64
typedef struct PAYLOAD {
uint8_t descriptor;
uint8_t parameters[MSG_MAX_PAYLOAD_LENGTH-1];
};
typedef struct MESSAGE {
uint8_t address;
uint8_t length;
PAYLOAD payload;
uint8_t checksum;
};
【问题讨论】:
-
旁注:这不是序列化的好方法。您很容易遇到对齐和严格的混叠违规问题。这段代码不会发生这种情况,因为所有类型都是
uint8_t,但是使用任何其他类型,你就会遇到问题。 (而且我还没有提到填充和字节序问题)。 -
@user694733 你能详细说明一下吗?我知道我可能会遇到问题,例如使用数组,但还有哪些其他类型会导致问题?您对如何将所有消息元素收集到一种类型有更好的想法吗?
-
基本上,您不能使用指向一种类型的转换指针来访问 C 中真正属于其他类型的数据。在某些情况下,这些规则有例外,但它确实是一个雷区。您可能(并且将会)被编译器做出不成立的假设或意外生成在您的硬件上无法可靠运行的代码所困扰。正确的方法(最便携和可靠)是通过使用位移和掩码并将结果分配给字节数组,手动将每个结构成员转换为字节。
-
@user694733 我能麻烦你写一个简单的例子吗?不确定你的意思的语法。
-
虽然不完美,this answer(以及关于该问题的其他答案)对这个想法有一个简短的概述。