设置为零二维数组(和其他东西)

时间:2012-02-10 03:18:52

标签: c arrays

int x=2,y=2;
int matrix[x][y];

如果我想将数组的每个元素设置为'1',我该怎么办?那么,如果我想将第2行的元素设置为零,我可以吗? 这似乎很容易,但我不知道如何指定行或数组的长度。

4 个答案:

答案 0 :(得分:1)

memset会在数组的每个byte中放置相同的内容 - 而不是每个int member,因此您可以将其用于0,但不能用于1.通过此,我建议使用循环,即使是0。

通常,在使用数组时,需要循环。使用2D数组(嵌套数组)时,需要嵌套循环。

int i,j;
//put 1 in every member
for (i=0;i<x;i++)
 for (j=0;j<y;j++)
  matrix[i][j]=1;
//put 0 in the 2nd line
for (j=0;j<y;j++)
 matrix[1][j]=0;

答案 1 :(得分:1)

初始化数组,如同编译器在创建变量时设置所有值,只有一种方法:

int matrix[x][y] = 
{
  {1,1},
  {1,1}
};

但是,C中有一条特殊规则允许您将每个数组项设置为零,只需键入:

int matrix[x][y] = { 0 };

这个使用零,如果你尝试使用任何其他值,只有数组的第一项被设置。

当然,有多种方法可以在运行时设置数组的项目,如其他答案所示,但那是赋值而不是初始化

编辑:

请注意,上述内容仅适用于“传统”静态分配的数组。如果使用名为“可变长度数组”的数组声明功能,则只能将其值设置为runtme。

可变长度数组(vla)是一个可以在运行时确定其边界的数组。在原始问题中,数组长度由运行时的非常数变量x和y确定。由于数组长度是在运行时确定的,因此所有初始化都必须在运行时完成(使用memset()等)。

请注意,vla仅适用于较新的C标准C99和C11!

答案 2 :(得分:0)

初始化整个数组的最佳选择是使用memset()。你需要使用sizeof()来获得数组的确切大小; 不要假设您知道int中有多少字节!您需要将一个指针,一个“字符”和一个大小传递给memset()。警告:memset()是一个锋利的工具。它将尝试将内存块设置为您指定的值,无论您的进程是否拥有该内存。警告2:始终,始终检查函数的返回值。在memset()的情况下,成功时它应该是传递的相同地址(指针)。

我是这样做的:

#include <string.h>

char *lpMyMem;

lpMyMem = memset(matrix, (int) '\0', sizeof(int)*x*y;

if lpMyMem != matrix)
{
/* setting memory failed.  display message. */
return(-1); /* or another error code of your choosing! */
}

/* the rest of your program */

答案 3 :(得分:0)

int x = 2, y = 2;
int matrix[x][y];

这声明了一个可变长度数组。无法初始化可变长度数组:即

int x = 2, y = 2;
int matrix[x][y] = {0};  // not valid, matrix is a vla

如果可能,请使用维度的常量,您就可以初始化matrix

#define X  2
#define Y  2
int matrix[X][Y] = {{1, 2}, {3, 4}};   // matrix is not a vla, ok

初始化后,您可以使用memset或通过赋值,逐元素地为数组元素赋值。