C 将字符复制到结构

标签 c

我读取了一堆输入(传感器),每个传感器都得到 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/

相关文章:

c - 函数地址错误

c - 使用插入排序和快速排序

c - 我怎样才能让这个程序更快?

c - Web 服务器未收到所有请求

c - 解决 n!用C(某处方程错误)

c++ - 与 g_signal_handlers_block_by_func() 等价的 gtkmm 是什么?

c - C语言中如何正确使用extern关键字

c - 为什么 C 中需要 volatile?

c - C语言代码中间包含什么?

c - 如何在LoadRunner中使用POST方法重写函数并使用GET方法?