使用结构初始化特定偏移量的数组可能吗?

时间:2018-05-03 16:14:03

标签: c arrays

说我有类似以下的结构

typedef struct {
   char field1: 4,
   char field2: 4
} MyStruct_t;

现在,有一个声明为

的大型数据缓冲区

char BigBuffer[2048]

我想使用上面定义的结构初始化数组的部分,我该怎么做?

char BigBuffer[2048] = {
   [10]  = (MyStruct_t)(.field1 = 5, field2 = 7),
   [20]  = (MyStruct_t)(.field1 = 7, field2 = 4),
   [200] = (MyStruct_t)(.field1 = 1, field2 = 9) }

这可能或类似吗?

我已经有了一个不同的解决方案,使用#define进行掩蔽和移动,

char BigBuffer[2048] = {
   [10]  = (5 & 0xf) << 4 | (7 & 0xf),
   [20]  = (7 & 0xf) << 4 | (4 & 0xf),
   [200] = (1 & 0xf) << 4 | (9 & 0xf) }

作为一个注释,我知道除非使用指令指定,否则结构中的位字段的打包将留给编译器。只是试图证明意图。谢谢!

1 个答案:

答案 0 :(得分:1)

不确定我的问题是否正确,但我仍然认为(5 & 0xf) << 4 | (7 & 0xf)更优雅。

#include <stdio.h>

typedef struct{
    char field1:4;
    char field2:4;
}MyStruct_t;

int main(){
    char b[2] = {
        [0] = *(char*)&(MyStruct_t){.field1 = 5, .field2 = 7},
        [1] = *(char*)&(MyStruct_t){.field1 = 7, .field2 = 4}
    };

    printf("%02x %02x\n", b[0], b[1]);
    return 0;
}