【发布时间】:2009-11-06 16:34:18
【问题描述】:
如何在声明时用 0 初始化二维数组?
double myArray[3][12] = ?
【问题讨论】:
如何在声明时用 0 初始化二维数组?
double myArray[3][12] = ?
【问题讨论】:
double myArray[3][12] = {0};
或者,如果您想避免 gcc 警告“在初始化程序周围缺少大括号”(警告出现在 -Wall 或更具体地说是 -Wmissing-braces)
double myArray[3][12] = {{0}};
【讨论】:
{0} 初始化程序自 C89(第一个标准化)以来一直有效。之前不知道。
如果要使用零进行初始化,请执行以下操作:
double myArray[3][12] = { 0 };
如果要填写实际值,可以嵌套大括号:
double myArray[3][3] = { { 0.1, 0.2, 0.3 }, { 1.1, 1.2, 1.3 }, { 2.1, 2.2, 2.3 } };
【讨论】:
pmg的方法是正确的,但是注意
double myArray[3][12] = {{}};
将给出相同的结果。
另外,请记住
double myArray[3][12] = {{some_number}};
只有在 some_number 为零时才会按预期工作。
例如,如果我要说
double myArray[2][3] = {{3.1}};
数组不会充满 3.1,而是会
3.1 0.0 0.0
0.0 0.0 0.0
(第一个元素是唯一设置为指定值的元素,其余的都设置为零)
这个question (c initialization of a normal array with one default value)有更多信息
【讨论】:
={ } 进行初始化似乎在 gcc 和 g++ 中都有效,但我不知道它是否正确。
gcc -std=c11 -pedantic ... 否则 gcc ... 与 gcc -std=gnu11 ... 相同
内存布局可能是相关的(例如,用于序列化)。
myArray[3][2] = { { 0.1, 0.2 }, { 1.1, 1.2 }, { 2.1, 2.2 } };
第一个索引是行索引,是最慢的索引。这被称为 C 顺序,而不是 F (Fortran) 顺序。
【讨论】:
我觉得会
double myArray[3][12] = {0}
【讨论】:
你可以使用
double myArray[3][12] = { 0 };
或
double myArray[3][12];
memset(myArray, 0, sizeof(double) * 3 * 12);
【讨论】:
pmg 的方法效果最好,因为它的工作原理是,如果你部分初始化任何数组,其余的将得到默认值零。否则,您可以将数组声明为全局变量,并且在未初始化时,数组元素将自动设置为默认值(取决于编译器)零。
【讨论】: