二维数组的意外初始化结果

Posted

技术标签:

【中文标题】二维数组的意外初始化结果【英文标题】:Unexpected Initializing outcome from 2D array 【发布时间】:2016-04-30 20:09:21 【问题描述】:

要初始化一个二维数组,通常我们可以这样做:

int matrix[3][4] =  1,1,1,1, 2,2,2,2, 3,3,3,3 ;

但是,当我使用各种组合对其进行测试时,以下代码确实超出了我的预期:

int matrix[3][4] = 1,2,3,4,5,6,7;

当我以 2D 表格形式打印输出时,我得到:

1,2,3,4,
5,6,7,0,
0,0,0,0,

我明白为什么其余的值都是零。

我的问题是:这是通过假设超出行界限的数字总是“流”到下一行来初始化二维数组的合法方法之一吗?或者这是我在 C++ 中应该避免的另一个陷阱?

【问题讨论】:

这是完全合法的。在标准化之前,它一直是 C 和 C++ 的一部分。尽管您可能认为更明确的版本更易于阅读。 @AlanStokes 感谢您的回复,虽然知道它是合法的,但我有点惊讶,因为我认为它确实可以编译,因为 C++ 不检查边界,并且数字只是坐在下一个可用的记忆。或者我可以这么说,因为下一个可用内存也作为数组的一部分“保留”。这样做可以吗? @user3437460 如果不检查边界,编译器如何将任何值设置为 0?如果超出范围,将导致编译器错误。 所有的初始化规则都不好总结,这里就留下this吧。 @user6276096 嗯,是的,你是对的。它会在编译时检查初始化器的数量。 【参考方案1】:

是的,这很好。引用the unofficial cppreference:

嵌套初始化列表周围的大括号可以省略 (省略),在这种情况下,必要的初始化子句是 用于初始化对应的每个成员或元素 子聚合,以及随后的初始化子句用于 初始化对象的以下成员。

还有:

如果初始化子句的数量小于 成员或初始化列表完全为空,其余成员 由执行值初始化的空列表初始化。

初始化int 的值将其设置为0

【讨论】:

以上是关于二维数组的意外初始化结果的主要内容,如果未能解决你的问题,请参考以下文章

C语言 指针初始化二维数组

如何在PHP的二维数组中进行模糊搜索?

怎么给一个二维数组赋不同的值

PHP中如何对二维数组按某个键值进行排序

verilog 二维数组不能赋值

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )