将大小可变的多维C数组初始化为零

11

我想要初始化一个可变大小的二维数组为零。

我知道对于固定大小的数组可以这样做:

int myarray[10][10] = {0};

但是如果我这样做,它就不起作用:

int i = 10;
int j = 10;
int myarray[i][j] = {0};

有没有一行代码可以完成这个操作,还是必须遍历数组中的每个元素?

谢谢

5个回答

9

你不能使用初始化器来初始化它,但你可以使用memset()将数组清零。

#include <string.h>

int main(void) {
  int a = 13, b = 42;
  int m[a][b];
  memset(m, 0, sizeof m);
  return 0;
}

注意:这是 C99C89 中,声明 m(int m[a][b];)是一个错误。


@vittorio88:您可能正在使用C++编译器。在C中,任何对象的指针(例如仅指向类型为int (*)[b]m)都兼容于指向void的指针(类型为void*),这也是memset()所需的内容。因此,没有问题。 - pmg

3
在线 C99 标准 (n1256 草案),第 6.7.8 节,第三段:

被初始化的实体的类型必须是一个未知大小的数组或者不是可变长度数组类型的对象类型。

强调为本人所加。

正如其他人所说,您最好使用 memset()


1
如果您获得了指向数据结构的指针,可以尝试使用memset

+1 - memset是初始化数组和新内存分配的最佳方式,它在C++中肯定有效,因此在C语言中也值得一试。 - ChrisBD
在大多数情况下,数组名称“衰减”为指向其第一个元素的指针。这也适用于多维数组,并且由于memset()采用void *,因此关于数组名称本身表示的指针类型没有问题。 - pmg
@pmg - 谢谢。我明白了,不过感谢你的澄清。 - kbrimington
@ChrisBD:一般来说,memset不是初始化数据的最佳方式。只有在必须使用时才应该使用它。在C中最好使用{ 0 }进行初始化(在C++中使用 { })。这样更具可移植性和更少的错误风险(很容易将参数以错误的顺序传递给 memset) 。 - jamesdlin
@james - 书写错误的风险不能公正地用来证明“绝非最佳方式”;如果是这样,所有具有超过一个参数的程序都将是完成任务的“绝非最佳方式”。 :) memset 是实现 OP 的要求的有效过程。 - kbrimington
@kbrimington:memset 特别容易出错,因为类型检查无法捕捉到最后两个参数交换的错误。 (此外,我更习惯于指针参数紧随其后跟着大小参数。)无论如何,那只是我的次要论点。(我确实同意在这种情况下使用 memset 是正确的。) - jamesdlin

0
你不能使用非常量变量创建静态数组。 尝试使用动态分配:
int i = 10;
int j = 10;
size_t nbytes = i*j*sizeof(int);
int* myarray = (int*) malloc(nbytes);
memset(myarray,0,nbytes);

C99 中,你确实能够使用非常量变量创建静态数组。舍为一处理的话,结果将会是 -1。 - pmg

-1

在C语言中不支持变量大小的二维数组。其中一个维度(我记不清是第一维还是第二维)必须是固定的。建议在定义后循环遍历该维度。


-0.5(四舍五入)C99支持可变大小的二维数组。 - pmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接