初始化多维数组中的一个值是否初始化了数组的其余部分?

时间:2015-10-30 19:33:56

标签: c arrays multidimensional-array

不久前,有人向我指出,初始化(一维)数组中的值也会使用0初始化数组的其余部分。也就是说,

int array[5] = { 1, 0, 0, 0, 0 };

......实际上与:

相同
double matrix[5][5] = { { 1.0 } };

多维数组是否一样?请考虑以下代码:

matrix[0][0]

如果0.0是唯一分配的值,那么其余的是垃圾(留在内存中的剩余部分),还是其余部分都填充了matrix

有人可能会说,我可以简单地迭代这些值来亲眼看看,但我担心我会幸运,并且总是{{1}}占据"空"内存(位数都是0)可能导致我得出错误的结论。

2 个答案:

答案 0 :(得分:4)

是的,它与多维数组相同。从C11草案N1570,$ 6.7.9.10:

  
      
  • 如果它有指针类型,则将其初始化为空指针;
  •   
  • 如果它有算术类型,则初始化为(正或无符号)零;
  •   
  • 如果是聚合,则每个成员都根据这些规则[上面] 进行初始化(递归),     并且任何填充都被初始化为零位;
  •   

因此,保证阵列的所有成员都被初始化为零。

答案 1 :(得分:1)

根据C标准

  

19初始化应在初始化程序列表顺序中进行,每个顺序   初始化程序为特定的子对象提供覆盖任何子对象   以前列出的同一子对象的初始值设定项; 151)全部   未初始化的子对象应初始化   隐式与具有静态存储持续时间的对象相同。

10如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 如果未明确初始化具有静态或线程存储持续时间的对象,则:

  

- 如果它有指针类型,则将其初始化为空指针;

     

- 如果它有算术类型,则初始化为(正数或   无符号)零;

     

- 如果是聚合,则每个成员都被初始化(递归)   根据这些规则,任何填充都被初始化为零位;

     

- 如果是联合,则初始化第一个命名成员   (递归地)根据这些规则,并初始化任何填充   为零位;

因此在此声明中

double matrix[5][5] = { { 1.0 } };

数组的第一个元素由1.0初始化,其他所有元素都由零初始化。

您可以选择性地使用明确指定的值初始化某些元素,例如

#include <stdio.h>

int main( void )
{
    double matrix[5][5] = { { [0] = 1.0, [4] = 1.0 }, { [2] = 2.0, [3] = 2.0 }, [4] = { 5, 5, 5, 5, 5 } };

    for ( size_t i = 0; i < 5; i++ )
    {
        for ( int j = 0; j < 5; j++ ) printf( "%lf ", matrix[i][j] );
        printf( "\n" );
    }        

    return 0;
}

程序输出

1.000000 0.000000 0.000000 0.000000 1.000000 
0.000000 0.000000 2.000000 2.000000 0.000000 
0.000000 0.000000 0.000000 0.000000 0.000000 
0.000000 0.000000 0.000000 0.000000 0.000000 
5.000000 5.000000 5.000000 5.000000 5.000000