当读取或写入缓冲区时,我相信通常需要访问大于缓冲区类型(指针)的数据。到目前为止,我已经提出了三种不同的方法,但我想知道是否有针对此的语言功能或公认的标准做法。选项 c
提供了最大的灵 active ,因为它可以处理结构和数组以及整数类型。
#include <stdio.h>
#include <stdint.h>
#define BUFFER_SIZE 10
#define ADDRESS 6
uint8_t buffer[BUFFER_SIZE] =
{
[ADDRESS] = 0x37,
[ADDRESS+1] = 0x42,
};
int main(void)
{
uint16_t a = buffer[ADDRESS] + (buffer[ADDRESS + 1]<<8);
uint16_t b = *(buffer + ADDRESS) + (*(buffer + ADDRESS + 1)<<8);
uint16_t c = *((uint16_t *) (buffer + ADDRESS));
printf("a: 0x%x\n", a);
printf("b: 0x%x\n", b);
printf("c: 0x%x\n", c);
return 0;
}
我不关心字节顺序,因为与缓冲区的所有交互都在单个嵌入式程序中;独立提供字节顺序安全的外部接口(interface)。最受关注的标准是 C99,但欢迎引用任何标准。
最佳答案
前两个是等价的,这里buffer[ADDRESS]
和*(buffer + ADDRESS)
是一样的
uint16_t a = buffer[ADDRESS] + (buffer[ADDRESS + 1]<<8);
uint16_t b = *(buffer + ADDRESS) + (*(buffer + ADDRESS + 1)<<8);
最后一个调用未定义的行为,因为它违反了 C 别名规则 (C99, 6.5p7) 并且可能会破坏对齐:
uint16_t c = *((uint16_t *) (buffer + ADDRESS));
总而言之,选择第一个,因为它更具可读性。
关于c - 在 C 中将变量读取为更大的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697560/