初始化类型的程序集

“复合”类型是结构、联合或数组类型。 如果聚合类型包含程序集类型的成员,初始化递归规则适用。

语法

  • 初始值设定项:
    { 初始值设定项列表 聚合初始化的**}** /* */

    { 初始值设定项列表 ,}

  • 初始值设定项列表:
    初始值设定项

    初始值设定项列表 初始值设定项

初始值设定项列表 是逗号分隔的初始值设定项列表。 在列表中的每个初始值设定项是或常数表达式或初始值设定项列表。 因此,初始值设定项列表可以嵌套。 此窗体可用于初始化聚合类型的聚合成员非常有用,如示例中所示本节。 但是,因此,如果一个自动标识符的初始值设定项是一个表达式,不需要是常数表达式;它只需要具有分配的相应类型更改为标识符。

对于每个初始值设定项列表,常数表达式的值按顺序,分配,向复合变量的相应成员。

如果比聚合类型、剩余该程序集类型的成员或组件初始化为 0 的初始值设定项列表 少值。 不显式初始化的自动标识符的初始值为未定义。 如果比聚合类型,导致错误 的初始值设定项列表 包含多个值。 这些规则应用于每个嵌入式初始值设定项列表,以及整体聚合。

结构的初始值设定项是同一类型的表达式或初始值设定项列表中大括号封闭其成员 ()。 未命名的位域成员未初始化。

当联合初始化时, 请初始值设定项列表 必须是一个常数。 常数表达式的值赋给联合的第一个成员。

如果数组具有未知的大小,初始值设定项的数目确定数组的大小,因此,其类型变为完成。 无法指定初始值设定项重复在 C 中,或在元数组初始化组件,无需提供所有前面的值。 如果您在程序需要此操作,编写在汇编语言的实例。

请注意初始值设定项的数目能将数组的大小:

int x[ ] = { 0, 1, 2 }

如果您指定大小并提供初始值设定项个数错误,但是,会生成错误。

Microsoft 专用

数组的最大大小由 size_t定义的。 定义在头文件 STDDEF.H, size_t 与该范围 0x00000000 的 unsigned int 到 0x7CFFFFFF。

关闭 Microsoft 特定

示例

此示例演示数组的初始值设定项。

int P[4][3] = 
{
    { 1, 1, 1 },
    { 2, 2, 2 },
    { 3, 3, 3,},
    { 4, 4, 4,},
};

此语句声明 P 作为四个由三个数组并初始化其第一行的元素为 1,第二行的元素为 2,依此类推到第四行。 注意该初始值设定项为第三个列表,第四行在最后一个常数表达式后包含逗号。 最后一个初始值设定项列表 ({4, 4, 4,},) 由逗号后面还可以跟 这些额外的逗号允许,但不需要;彼此分隔常数表达式本身初始值设定项从另一个列表,只需要的逗号和一些。

如果一个复合成员没有嵌入初始值设定项列表,值按顺序进行,,为子集的每个成员。 因此,在前面的示例中的初始化具有以下是等效的:

int P[4][3] = 
{
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};

大括号可以在列表中的各个初始值设定项附近还显示,并帮助阐明上面的示例。

在初始化复合变量时,必须注意使用大括号,并且初始值设定项正确列表。 下面的示例将更详细地说明了大括号的编译器解释:

typedef struct 
{
    int n1, n2, n3;
} triplet;

triplet nlist[2][3] = 
{
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */
};

在此示例中, nlist 声明为 2 x 3 的结构数组,则每个结构的三个成员。 初始化的行 1 赋值。 nlist第一行,如下所示:

  1. 第一个位于第 1 行信号保留大括号编译器 nlist (即 nlist[0]) 的第一个复合成员的初始化开始。

  2. 第二个左侧的大括号指示 nlist[0] (即 nlist[0][0]结构的) 第一个复合成员的初始化开始。

  3. 第一个右大括号关闭 framework nlist[0][0]的初始化;下一个左大括号开始 nlist[0][1]的初始化。

  4. 进程继续直到行尾,该结束右大括号结束 nlist[0]的初始化。

第 2 行赋值。 nlist 第二行中包含一个类似的方式。 请注意外部位于第 1 行的设置大括号初始值设定项,并且需要 2。 下面的构造,而忽略外部大括号,将会产生错误:

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */
{
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */
};

此构造,位于第 1 行的第一个左侧的大括号开始 nlist[0]的初始化,是一组三结构。 值 1, 2 和 3 赋给第一个结构的三个成员。 在下一个右大括号遇到时 (在值为 3), nlist[0] 的初始化之后完成的,因此,在三个结构数组的两个剩余的框架自动初始化为 0。 同样, { 4,5,6 } 初始化。 nlist第二行的第一个结构。 nlist[1] 剩余的两个结构设置为 0。 当编译器遇到下一个初始值设定项列表 ({ 7,8,9 }),它尝试初始化 nlist[2]。 因为 nlist 只有两行,此尝试导致错误。

在此下一个示例中, x 的三个 int 成员初始化为 1、 2 和 3,,分别。

struct list 
{
    int i, j, k;
    float m[2][3];
} x = {
        1,
        2,
        3,
       {4.0, 4.0, 4.0}
      };

在上面 list 结构,在 m 第一行的三个元素初始化为 4.0; m 剩余行的默认元素初始化为 0.0。

union
{
    char x[2][3];
    int i, j, k;
} y = { {
            {'1'},
            {'4'} 
        }
      };

该联合变量的 y,在此示例中,初始化。 该联合的第一个元素是数组,因此,该初始值设定项是一个聚合初始值设定项。 该初始值设定项列表 {'1'} 值赋给数组的第一行。 因为只有一个值显示在列表中,第一列中的元素初始化为字符 1,默认情况下,并在该行中的余下两个元素初始化为值 0。 同样, x 第二行的第一个元素初始化为字符, 4,并在该行中的余下两个元素初始化为值 0。

请参见

概念

初始化