我想要初始化一个可变大小的二维数组为零。
我知道对于固定大小的数组可以这样做:
int myarray[10][10] = {0};
但是如果我这样做,它就不起作用:
int i = 10;
int j = 10;
int myarray[i][j] = {0};
有没有一行代码可以完成这个操作,还是必须遍历数组中的每个元素?
谢谢
我想要初始化一个可变大小的二维数组为零。
我知道对于固定大小的数组可以这样做:
int myarray[10][10] = {0};
但是如果我这样做,它就不起作用:
int i = 10;
int j = 10;
int myarray[i][j] = {0};
有没有一行代码可以完成这个操作,还是必须遍历数组中的每个元素?
谢谢
你不能使用初始化器来初始化它,但你可以使用memset()
将数组清零。
#include <string.h>
int main(void) {
int a = 13, b = 42;
int m[a][b];
memset(m, 0, sizeof m);
return 0;
}
注意:这是 C99
。 在 C89
中,声明 m(int m[a][b];
)是一个错误。
被初始化的实体的类型必须是一个未知大小的数组或者不是可变长度数组类型的对象类型。
强调为本人所加。
正如其他人所说,您最好使用 memset()
。
void *
,因此关于数组名称本身表示的指针类型没有问题。 - pmgmemset
不是初始化数据的最佳方式。只有在必须使用时才应该使用它。在C中最好使用{ 0 }
进行初始化(在C++中使用 { }
)。这样更具可移植性和更少的错误风险(很容易将参数以错误的顺序传递给 memset
) 。 - jamesdlinmemset
是实现 OP 的要求的有效过程。 - kbrimingtonmemset
特别容易出错,因为类型检查无法捕捉到最后两个参数交换的错误。 (此外,我更习惯于指针参数紧随其后跟着大小参数。)无论如何,那只是我的次要论点。(我确实同意在这种情况下使用 memset
是正确的。) - jamesdlinint i = 10;
int j = 10;
size_t nbytes = i*j*sizeof(int);
int* myarray = (int*) malloc(nbytes);
memset(myarray,0,nbytes);
C99
中,你确实能够使用非常量变量创建静态数组。舍为一处理的话,结果将会是 -1。 - pmg在C语言中不支持变量大小的二维数组。其中一个维度(我记不清是第一维还是第二维)必须是固定的。建议在定义后循环遍历该维度。
C99
支持可变大小的二维数组。 - pmg
int (*)[b]
的m
)都兼容于指向void的指针(类型为void*
),这也是memset()
所需的内容。因此,没有问题。 - pmg