c - 如何将 typedef struct 转换为 uint8_t 参数
问题描述
我有一个定义的函数:
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() 函数返回需要算术或指针类型的“数据”类型的操作数
如何将 typedef 结构转换为 uint8_t?如果我将其用作参考并且我得到相同的错误
如果我只使用 char 数组,我可以直接转换它,但在使用 typedef 结构时不能
解决方案
您需要转换结构对象的地址,而不是结构对象本身:
match_data((uint8_t *)&input, sizeof(input));
这是有效的,因为对象的地址保证等于第一个成员的地址(即chars
)。
但是请注意,访问其他数据成员(即ADC
通过这样的指针)是不安全/未定义的行为。这是因为编译器可能会在成员之间引入填充字节,并且访问此类填充区域是未定义的行为(因为填充区域处于不确定状态;例如,请参见此在线 C 标准草案):
J.2 未定义行为...具有自动存储持续时间的对象的值在不确定时使用。
所以实际上我会说你应该chars
直接通过:
match_data(input.chars, sizeof(input.chars));
推荐阅读
- python-3.x - lightgbm是真的能捕捉到线性趋势吗
- lua - 具有 nil 值的 Lua 长度运算符 (#)
- git - 当我尝试在 VS2019 中应用某个 git stash 时,我收到一条错误消息,提示存在未提交的更改(没有)并且只应用了一个文件
- jquery - 带有两个嵌套弹性框的动态网格网格不起作用?
- react-native - 通过单击 React Native 中的按钮在 TabNavigator 上的屏幕之间导航
- firebase - 对 Firebase 模拟器被忽略的功能进行故障排除
- ios - 是否可以跨多个 UIViewController 使用单个 UIView?
- google-calendar-api - Google Actions 中的 Google 日历 API 身份验证
- c - gcd() 函数中的递归调用次数
- javascript - 2个时刻对象之间的Javascript差异返回-1