我必须在车辆的LAN中发送UDP数据包。 UDP数据包包含5个字段:
field_1: 4 bytes uint32_t
field_2: 1 byte uint8_t
field_3: 1 byte uint8_t
field_3: 2 bytes uint16_t
field_4: 20 bytes 5*float
我想知道在chars缓冲区中执行memcpy是否符合MISRA C,代码在这里:
uint32_t field_1 = 25;
uint8_t field_2 = 34;
uint8_t field_3 = 1;
uint16_t field_4 = 234;
float field_5[5] = {1,2,3,4,5};
/* Allocate memory for the buffer*/
int l_buffLen = sizeof(uint32_t)
+ sizeof(uint8_t)
+ sizeof(uint8_t)
+ sizeof(uint16_t)
+ 5*sizeof(float);
char buffer[l_buffLen];
/* Copy data to the buffer */
int idx = 0;
memcpy(&buffer[idx],&field_1,sizeof(uint32_t));
idx+=sizeof(uintt32_t);
memcpy(&buffer[idx],&field_2,sizeof(uint8_t));
idx+=sizeof(uint8_t);
memcpy(&buffer[idx],&field_3,sizeof(uint8_t));
idx+=sizeof(uint8_t);
memcpy(&buffer[idx],&field_4,sizeof(uint16_t));
idx += sizeof(uint16_t);
memcpy(&buffer[idx],field_5,sizeof(float)*5);
答案 0 :(得分:1)
MISRA C不禁止使用memcpy()
MISRA C:2012 Amendment 1(免费下载)提供了一些有关使用memcpy()来帮助避免C标准中某些未定义/未指定行为的指南-有很多工具可帮助您分析您的代码
注意:请参阅个人资料以免责声明
答案 1 :(得分:0)
用于复制已知大小的字节块的正确工具是memcpy()
。如果MISRA为您着迷,那么MISRA不值得用它打印的电子。