我有这个签名的功能:

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)吗?

最佳答案

当您可以交换arrayarray_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/

10-13 06:19