c - 在 C 中缓冲的类型化数据

标签 c

我有一个带有此签名的函数:

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

最佳答案

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

相关文章:

C语言枚举数据类型?

c - 重新分配(): invalid next size when reallocating to make space for strcat on char *

c - 从UINT16到UINT8提取和组合位的更快方法

c++ - 在运行时检查 C++ 共享依赖项(ldd on self)

c - 从 txt 文件读取到动态分配

无法理解 sysinfo 返回的负载

c - 如何有效地将一 block 内存与单个字节进行比较?

c - 在 C 中重复使用 getchar() 时出现的问题

java - 查找给定输入的数据类型

在 C 中创建嵌套结构的动态自定义数组