我有一个定义的函数:
uint32_t match_data(uint8_t * data_in, uint16_t size_data_in);
我尝试使用以下typedef结构作为参数
typedef struct
{
uint8_t chars[5]
uint8_t ADC;
}Data
Data input;
input.chars[0] = 65;
input.chars[1] = 66;
input.chars[2] = 67;
input.chars[3] = 68;
input.chars[4] = 69;
input.ADC = 255;
match_data((uint8_t *)input, sizeof(input));
match_data()函数返回“算术”或指针类型为“数据”类型的操作数
如何将类型定义结构转换为uint8_t?如果我将其用作参考并且出现相同的错误
如果我仅使用char数组,而使用typedef struct则不可以直接将其强制转换
答案 0 :(得分:1)
您需要转换结构对象的地址,而不是结构对象本身:
match_data((uint8_t *)&input, sizeof(input));
之所以可行,是因为确保对象的地址等于第一个成员的地址(即chars
)。
但是,请注意,通过此类指针访问其他数据成员(即ADC
)是不安全/不确定的行为。这是因为编译器可能会在成员之间引入填充字节,并且访问此类填充区域是未定义的行为(因为填充区域处于不确定状态;例如,参见此online C standard draft):
J.2未定义的行为 ... ...具有自动存储持续时间的对象的值在不确定时使用。
所以实际上我想你应该直接通过chars
:
match_data(input.chars, sizeof(input.chars));