用一个值初始化整个二维数组

随着下面的声明

int array[ROW][COLUMN]={0}; 

我得到所有零的数组,但与下面的一个

 int array[ROW][COLUMN]={1}; 

我没有得到具有所有一个值的数组。 默认值仍然是0。

为什么这个行为,我怎么可以初始化所有1?

编辑:我刚刚明白,使用memset的值为1,将设置每个字节为1,因此每个数组单元格的实际值不会是1,但16843009 。 我如何将它设置为1?

你得到这个行为,因为int array [ROW][COLUMN] = {1}; 并不意味着“将所有项目设置为一个”。 让我试着解释这是如何一步一步工作的。

初始化你的数组的明确,清晰的方法是这样的:

 #define ROW 2 #define COLUMN 2 int array [ROW][COLUMN] = { {0, 0}, {0, 0} }; 

但是,C允许你省略数组中的一些项(或者struct / union)。 你可以例如写:

 int array [ROW][COLUMN] = { {1, 2} }; 

这意味着,将第一个元素初始化为1和2,其余元素“好像它们具有静态存储持续时间”。 C中有一条规则,说明所有静态存储持续时间的对象,都没有被程序员明确地初始化,必须设置为零。

所以在上面的例子中,第一行设置为1,2,下一个设置为0,0,因为我们没有给它们任何明确的值。

接下来,在C中有一个规则允许宽松的支撑风格。 第一个例子也可以写成

 int array [ROW][COLUMN] = {0, 0, 0, 0}; 

虽然这样的风格当然是不好的,但是阅读和理解起来却比较困难。 但是这个规则很方便,因为它允许我们写

 int array [ROW][COLUMN] = {0}; 

这意味着:“将第一行中的第一列初始化为0,并且将所有其他项目初始化为具有静态存储持续时间,即将其设置为零。

因此,如果你尝试

 int array [ROW][COLUMN] = {1}; 

这意味着“将第一行中的第一列初始化为1,并将所有其他项目设置为零”。

如果你想初始化数组为-1那么你可以使用以下,

 memset(array, -1, sizeof(array[0][0]) * row * count) 

但是这只会工作0-1

 int array[ROW][COLUMN]={1}; 

这只会将第一个元素初始化为1.其他所有元素都为0。

在第一个例子中,你是这样做的 – 初始化第一个元素为0,其余的默认为0。

原因很简单:对于一个数组,编译器将初始化你没有用0指定的每个值。

使用char数组可以使用memset来设置每个字节,但是这通常不能用于int数组(尽pipe对于0来说可以)。

一般的for循环会很快做到这一点:

 for (int i = 0; i < ROW; i++) for (int j = 0; j < COLUMN; j++) array[i][j] = 1; 

或者可能更快(取决于编译器)

 for (int i = 0; i < ROW*COLUMN; i++) *((int*)a + i) = 1;