[英]Typed data to buffer in 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中,我可以創建一個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);
您可以創建大小為4的指針數組,其中第一個元素是指向param1的指針,第二個元素是指向param2的指針,第三個元素是指向數組的指針,第四個元素是指向數組的指針數組的大小。
uint8_t* arrayOfPointers[4]={¶m1,¶m2,&array,&array_length};
uint8_t* buff = arrayOfPointers;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.