我有一个带有此签名的函数:
void my_func(uint8_t param1, uint8_t param2, uint8_t* array, uint8_t array_length)
给定的参数必须放置在这样的缓冲区中:
uint8_t buff = {param1, param2, array[0], ..., array[length - 1], array_length};
并作为参数提供给一个不可修改的函数,该函数采用缓冲区及其长度。
void consume(uint8_t* buff, uint8_t length)
在 my_func 中我可以创建一个大小为 的缓冲区:
sizeof(param1) + sizeof(param2) + array_length
但它为已经存在的数组使用额外的内存。
作为非可移植解决方案,我更喜欢使用打包结构并像这样定义 my_func :
typedef struct __attribute__((packed))
{
uint8_t param1;
uint8_t param2;
uint8_t array[MAX_ARRAY_SIZE];
uint8_t array_length;
}TsMyStruct;
void my_func(TsMyStruct*);
通过这个解决方案,我可以直接将 TsMyStruct* 转换为 uint8_t* 并将其提供给 Consumer() 函数:
consume(uint8_t* (mystruct), sizeof(TsMyStruct))
此解决方案的缺点是,对于大小 < MAX_ARRAY_SIZE 的数组,此解决方案并不比第一个命题更好。
您还有其他建议(不使用 malloc)吗?
最佳答案
当您可以交换array
和array_length
时(我不明白,您的订单对于动态array_length
有何意义),您可以写
struct foo {
uint8_t param1;
uint8_t param2;
uint8_t array_length;
uint8_t array[]
};
并分配+填充它就像
struct foo *buf = malloc(sizeof *buf + array_length);
buf->param1 = param1;
buf->param2 = param2;
buf->array_length = array_length;
memcpy(buf->array, array, array_length);
关于c - 在 C 中缓冲的类型化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49200553/