因为我希望尽可能地使它成为通用的,所以我希望能够为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中为未知(大小)结构创建缓冲区所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)