我有这个签名的功能:
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中,我可以创建一个size的缓冲区:
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 *,并将其赋予consume()函数:
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/