c结构的初始化,包括union

c结构的初始化,包括union,c,struct,initialization,union,C,Struct,Initialization,Union,我想用以下值初始化以下结构的colormodelblock: extension\u size=4 model=0 red=0 green=0 blue=0 typedef struct { int extension_size; ColourModelData ext; } ColourModelBlock; typedef struct { unsigned int model;

我想用以下值初始化以下结构的
colormodelblock

extension\u size=4

model=0

red=0

green=0

blue=0

typedef struct {
  int                           extension_size;
  ColourModelData               ext;
} ColourModelBlock;

typedef struct {

  unsigned int      model; 
  union {

    struct {
       int               red;                  /* % */
       int               green;                /* % */
       int               blue;                 /* % */
    } rgb;

    struct {
       int               cyan;                 /* % */
       int               magenta;              /* % */
       int               yellow;               /* % */
       int               key;                  /* % */
    } cmyk;

    struct {
      int               hue;                  /* angle (degrees) */
       int               saturation;           /* % */
       int               value;                /* % */
    } hsv;

    char bytes[16];
    int  words[4];
  } data;
} ColourModelData;
任务似乎很简单,但我尝试直接设置值(这对
extension\u size
model
有效,但我不知道如何设置联合值)或使用
int
数组的
memcpy


但是我对C很陌生,所以我可能把它搞砸了。

红色绿色和蓝色字段位于名为
数据
的联合体中名为
rgb
的结构中。如果您有一个名为
colormodeldata
colormodeldata
类型的变量,您可以如下设置其RGB:

colormodeldata.data.rgb.red=0;
colormodeldata.data.rgb.green=0;
colormodeldata.data.rgb.blue=0;

红色
绿色
蓝色
字段位于名为
rgb的结构内部,位于名为
数据
的联合中。如果您有一个名为
colormodeldata
colormodeldata
类型的变量,您可以如下设置其RGB:

colormodeldata.data.rgb.red=0;
colormodeldata.data.rgb.green=0;
colormodeldata.data.rgb.blue=0;

首先,在定义
colormodelblock
之前,必须声明
colormodelblock

然后,关于如何初始化
colormodelblock
,有几种选择。首先,要初始化结构,可以在大括号中列出它们的值。当涉及联合时,将初始化联合的第一个成员:

ColourModelBlock x = { 4, { 0, {{ 0, 0, 0 }} } };
这里,内部大括号遵循
colormodelblock
的结构,对每个包含的
struct
union
使用
{/code>。编译器将接受没有这些大括号的代码,并按相同的顺序初始化,但它可能会警告您,最好使用大括号,因为它将帮助捕获错误

第二,您可以使用成员名称来指示使用每个值初始化的成员。这还允许您通过第一个成员以外的其他成员初始化联合,尽管此处没有这样做:

ColourModelBlock x = {
        .extension_size = 4,
        .ext = {
            .model = 0,
            .data.rgb = { 0, 0, 0 }
        }
    };
请注意,上述方法实际上使用了多种方法的组合。大多数成员都是通过名称初始化的,称为指定的初始值设定项。但是,
.data.rgb
将一个联合命名,然后使用列表初始化其成员,就像第一个方法一样。在这种情况下,
rgb
成员被视为三元组时,这可能很自然

您还可以定义对象,然后使用赋值语句为其赋值。上面的语法用于初始化。赋值需要不同的语法:

ColourModelBlock x;
x.extension_size = 4;
x.ext.model = 0;
x.ext.data.rgb.red   = 0;
x.ext.data.rgb.green = 0;
x.ext.data.rgb.blue  = 0;
可以使用复合文字在赋值中使用初始化语法。要创建复合文字并在赋值中使用它,请使用上面的任何初始化列表,并将类型名称放在前面的括号中,然后将其用作赋值的右侧:

x = (ColourModelBlock) { 4, { 0, {{ 0, 0, 0 }} } };
最后,由于要用作初始值的大多数值都是零,因此可以忽略它们。如果正在初始化结构,并且没有为所有成员提供显式值,则没有显式值的成员将被初始化为零(对于指针,则为空指针):


首先,在定义
colormodelblock
之前,必须先声明
colormodelblock

然后,关于如何初始化
colormodelblock
,有几种选择。首先,要初始化结构,您可以在大括号中列出它们的值。当涉及联合时,将初始化联合的第一个成员:

ColourModelBlock x = { 4, { 0, {{ 0, 0, 0 }} } };
这里,内部大括号遵循
colormodelblock
的结构,对每个包含的
struct
union
使用
{/code>。编译器将接受没有这些大括号的代码,并按相同的顺序初始化,但它可能会警告您,最好使用大括号,因为它将帮助捕获错误

第二,您可以使用成员名称来指示使用每个值初始化的成员。这还允许您通过第一个成员以外的其他成员初始化联合,尽管此处没有这样做:

ColourModelBlock x = {
        .extension_size = 4,
        .ext = {
            .model = 0,
            .data.rgb = { 0, 0, 0 }
        }
    };
请注意,上述方法实际上使用了多种方法的组合。大多数成员都是通过名称初始化的,称为指定的初始值设定项。但是,
.data.rgb
将一个联合命名,然后使用列表初始化其成员,就像第一个方法一样。在这种情况下,
rgb
成员被视为三元组时,这可能很自然

您还可以定义对象,然后使用赋值语句为其赋值。上面的语法用于初始化。赋值需要不同的语法:

ColourModelBlock x;
x.extension_size = 4;
x.ext.model = 0;
x.ext.data.rgb.red   = 0;
x.ext.data.rgb.green = 0;
x.ext.data.rgb.blue  = 0;
可以使用复合文字在赋值中使用初始化语法。要创建复合文字并在赋值中使用它,请使用上面的任何初始化列表,并将类型名称放在前面的括号中,然后将其用作赋值的右侧:

x = (ColourModelBlock) { 4, { 0, {{ 0, 0, 0 }} } };
最后,由于要用作初始值的大多数值都是零,因此可以忽略它们。如果正在初始化结构,并且没有为所有成员提供显式值,则没有显式值的成员将被初始化为零(对于指针,则为空指针):