不久前,有人向我指出,初始化(一维)数组中的值也会使用0初始化数组的其余部分。也就是说,
int array[5] = { 1, 0, 0, 0, 0 };
......实际上与:
相同double matrix[5][5] = { { 1.0 } };
多维数组是否一样?请考虑以下代码:
matrix[0][0]
如果0.0
是唯一分配的值,那么其余的是垃圾(留在内存中的剩余部分),还是其余部分都填充了matrix
?
有人可能会说,我可以简单地迭代这些值来亲眼看看,但我担心我会幸运,并且总是{{1}}占据"空"内存(位数都是0)可能导致我得出错误的结论。
答案 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