Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可能使用结构在特定偏移量处初始化数组?_C_Arrays - Fatal编程技术网

C 是否可能使用结构在特定偏移量处初始化数组?

C 是否可能使用结构在特定偏移量处初始化数组?,c,arrays,C,Arrays,假设我有一个如下的结构 typedef struct { char field1: 4, char field2: 4 } MyStruct_t; 现在,声明了一个大的数据缓冲区 charbigbuffer[2048] 我想使用上面定义的结构初始化数组的各个部分,我该怎么做 char BigBuffer[2048] = { [10] = (MyStruct_t)(.field1 = 5, field2 = 7), [20] = (MyStruct_t)(.field

假设我有一个如下的结构

typedef struct {
   char field1: 4,
   char field2: 4
} MyStruct_t;
现在,声明了一个大的数据缓冲区

charbigbuffer[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 with masking and shift

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

[10] =(5&0xf)不确定我是否正确理解了你的问题,但我仍然相信
(5&0xf)你不能这样做。你以后可以
memcpy
你的结构。但是你可以使用一个奇特的
联合,你可以用结构初始化并作为数组访问。尤金,谢谢。我可能会想象这样的情况。结构是较大缓冲区的一小部分。我会覆盖它们,但考虑到我手头的情况,这不太实际ed.我试图找到一种方法,在构建时和作为crt一部分的初始化期间找到这些值。我想是的。@J…有点像
union{char BigBuffer[2048];struct{char pad0[xx];MyStruct_ts0;char pad1[xx];MyStruct_ts1;…}
Nice。这在使用gcc的CLion中起作用。不幸的是,我在项目中使用的工具给了我一个错误“error:initializer元素不是编译时常量”以及工具错误。@是的,它违反了标准:“一元运算符和运算符的操作数应该是函数指示符、
[]
或一元运算符的结果,或者是指定一个对象的左值,该对象不是位字段,也不是用寄存器存储类说明符声明的。”因此,这取决于编译器。
#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;
}