我读取了一堆输入(传感器),每个传感器都得到 0(关闭)或 1(打开)。我在一个 char* 中得到这些值,其中我有所有传感器的结果。每个传感器 1 位。
当我想在我的代码中使用这些值时,我觉得将这个结果与另一个设置了我感兴趣的一位的字符进行 AND 运算并不是一个好主意,因为代码会变得非常臃肿。
相反,我正在考虑制作一个像这样的结构:
struct sensors {
unsigned int Sensor0:1;
unsigned int Sensor1:1;
unsigned int Sensor2:1;
unsigned int Sensor3:1;
unsigned int Sensor4:1;
unsigned int Sensor5:1;
unsigned int Sensor6:1;
unsigned int Sensor7:1;
}
struct sensors s1;
memcpy(buf, (char*)&sensors, 1);
但据我所读,结构可能不会将每个组件都保存在内存中,并且可能会在它们之间插入填充和其他内容,这使得这是行不通的。
我错了吗?有没有更好的方法来做到这一点?
最佳答案
根据您当前对 struct sensors
的定义,编译器将插入额外的填充,因为 int
具有对齐要求,通常在 sizeof(int)
边界。此外,int
必须比 char
宽,因此它可以容纳 8 个以上的标志,而您不需要这些。
如果您这样声明它(使用 unsigned char
代替),则不应有填充,因为 char
具有最不严格的对齐要求:
struct sensors {
unsigned char Sensor0:1;
unsigned char Sensor1:1;
unsigned char Sensor2:1;
unsigned char Sensor3:1;
unsigned char Sensor4:1;
unsigned char Sensor5:1;
unsigned char Sensor6:1;
unsigned char Sensor7:1;
}
这可能不适用于 CHAR_BIT != 8
的非常奇怪的平台。
关于C 将字符复制到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8213658/