我想要完成的是
用户输入位域宽度,例如17 5 8 19 0(可以是或多或少的位字段)0状态位字段输入结束
然后用户输入要存储在分配的数组中的值,用于位字段大小 说1 2 3 4
如何扫描几个位字段值以放入这样的结构中?
struct{
unsigned int bit0:1;
unsigned int bit1:1;
unsigned int bit2:1;
unsigned int bit3:1;
}pack;
那么在将数组设置为位字段大小时这是否正确? 我正在使用"位字段输入"但是,我现在会扫描它们。
pack = (int *)malloc(sizeof(struct)*bit field inputs);
我相信我问我原来的问题不对,
我试图在这里做的是取值1并将其放入一个字段宽度,如17
并重复此操作最多5个值。
如果用户输入位字段宽度,我将如何取值1并将其存储在17的字段宽度中?
答案 0 :(得分:2)
如果您需要动态位字段宽度,则需要进行自己的位操作。为了兼容性,无论如何都应该这样做 如果没有,您必须将其读入标准类型(如int),然后将其设置为位域,以便编译器为您完成bitpacking。但要注意,该标准对编译器选择提供的保证很少。
此外,永远不会转换malloc
:Do I cast the result of malloc?的返回值。
答案 1 :(得分:1)
由编译器决定位域的顺序和填充。没有保证。
一般情况下,你应该只使用位域"内部"在你的程序中。无论何时序列化位域,都可能会遇到不兼容问题。
通常会通过序列化到已知大小和对齐的结构,然后明确地将值复制到您的位域以在内部使用来获得更好的效果。
再次重新阅读你的问题之后,我认为你最好在连续的字节上使用位屏蔽操作。这允许您控制内部表示的内存布局。
听起来你想:
或者,如果您不关心大小,只需将所有内容都设置为无符号整数数组,然后让编译器为您进行对齐。