malloc位字段值到c中的数组

时间:2014-04-18 19:45:14

标签: c arrays malloc bit-fields

我想要完成的是

用户输入位域宽度,例如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的字段宽度中?

2 个答案:

答案 0 :(得分:2)

如果您需要动态位字段宽度,则需要进行自己的位操作。为了兼容性,无论如何都应该这样做 如果没有,您必须将其读入标准类型(如int),然后将其设置为位域,以便编译器为您完成bitpacking。但要注意,该标准对编译器选择提供的保证很少。

此外,永远不会转换mallocDo I cast the result of malloc?的返回值。

答案 1 :(得分:1)

由编译器决定位域的顺序和填充。没有保证。

一般情况下,你应该只使用位域"内部"在你的程序中。无论何时序列化位域,都可能会遇到不兼容问题。

通常会通过序列化到已知大小和对齐的结构,然后明确地将值复制到您的位域以在内部使用来获得更好的效果。

再次重新阅读你的问题之后,我认为你最好在连续的字节上使用位屏蔽操作。这允许您控制内部表示的内存布局。

听起来你想:

  1. 从输入字符串中读取并存储位偏移量
  2. 总结用户想要从输入字符串中使用的位数
  3. malloc连续内存的一些字节,足够大 包含用户位
  4. 为位位置和数据长度提供访问器功能, 然后使用掩码设置位。
  5. 或者,如果您不关心大小,只需将所有内容都设置为无符号整数数组,然后让编译器为您进行对齐。