在C中为未知(大小)结构创建缓冲区

在C中为未知(大小)结构创建缓冲区,第1张

概述我正在为RF24Mesh微控制器层编写一个抽象层来实现消息签名. 因为我希望尽可能地使它成为通用的,所以我希望能够为ex传递任何struct / payload :(这只是一个应该能够传递给函数的结构的示例) struct payload_sensor { uint8_t some_other_sensor_data[32]; int sensor_id; 我正在为RF24Mesh微控制器层编写一个抽象层来实现消息签名.

因为我希望尽可能地使它成为通用的,所以我希望能够为ex传递任何struct / payload :(这只是一个应该能够传递给函数的结构的示例)

struct payload_sensor {        uint8_t some_other_sensor_data[32];        int sensor_ID;        int sensor_data;  };

到签名函数,然后让它处理存储有效负载/结构,直到完成所有其他 *** 作发送它.

但是事实上,我无法预测传递给函数的结构的确切大小(它应该处理传递给它的任何结构),相同的结构可能会被重用(填充其他数据)并再次传递给函数.我完全无法想到一个好的解决方案.

现在,我如何实现一个适当的缓冲区来存储这些未知的有效负载/结构,直到它们准备好发送?我还必须记住,代码是在AVR上运行的,因此AVR内存(碎片)可能会成为一个问题.

我对结构和更高级的东西都是新手,所以不要介意我错过了一些明显的东西.

解决方法 通常通过定义结构来解决这类问题,例如:

struct payload_sensor {    unsigned int struct_size;    int sensor_ID;    type any_other_always_present_data;    char variable_data[];};

其中variable_data是有效负载的未知部分.

当您知道实际的variable_data需要多大时,您可以执行以下 *** 作:

unsigned int actual_length = length_of_variable_data + sizeof(struct payload_sensor);struct payload_sensor *myStruct = malloc(actual_length);myStruct->struct_size = actual_length;

并将您的可变数据复制到结构:

memcpy(&myStruct->variable_data,&data_source,length_of_variable_data);

根据评论和编辑,听起来你的意图是能够将数据传递给某些必须保留数据副本的函数,直到稍后的某个时间点,并且该函数不知道它被要求的内容.保持.如果是这种情况,您需要做的就是告诉函数每次调用的长度.例如,voID myFunction(const voID * buffer,unsigned int length);:

myFunction(&myStructOfType1,sizeof(myStructOfType1));myFunction(&myStructOfType2,sizeof(myStructOfType2));

并且,基于您对重用结构的关注,将myFunction()复制长度字节从缓冲区开始到存储事物的任何位置(以及记录存储在副本地址的长度)以供将来处理.

总结

以上是内存溢出为你收集整理的在C中为未知(大小)结构创建缓冲区全部内容,希望文章能够帮你解决在C中为未知(大小)结构创建缓冲区所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存