使用0填充多维数组元素

use*_*871 9 c++

我有一个2d,我想将元素设置为零而不循环所有元素

int a[100][200];
Run Code Online (Sandbox Code Playgroud)

我无法在声明点初始化它们.

bta*_*bta 25

尝试

int a[100][200] = {{0}};
Run Code Online (Sandbox Code Playgroud)

如果初始化一些(但不是全部)元素,其余元素将初始化为零.在这里,您只是显式初始化第一个子数组的第一个元素,编译器正在处理其余部分.

  • 而且为了缩短它,C++允许`= {};`. (12认同)
  • +1` = {0}`也应该有效,但这可能会更好地避免编译器警告. (2认同)

Ale*_*ler 13

尝试 memset(a,0,sizeof(a));

这只是用0字节覆盖数组使用的内存.除非您确实知道自己的操作,否则不要对用户定义的数据类型执行此操作.还有std::fillstd::fill_n,这是比较C++ ISH(但不是在这里最简单的方法).

  • 即使对于非用户定义的数据类型,这也可能会产生意外结果.数据成员指针是在C++中使用非0x0空指针编码的示例 - 由GCC和Clang("Itanium ABI")使用的ABI - 它们使用全1位.对于"int",这应该没问题. (2认同)
  • 不,数组上的sizeof以字节为单位返回正确的大小,因此不需要乘以int大小. (2认同)

Joh*_*itb 6

C++ 允许通过基本元素指针完全迭代多维数组。所以你可以使用std::fill并传递第一个非数组元素

std::fill(a[0] + 0, a[99] + 100, 0);
Run Code Online (Sandbox Code Playgroud)

在 C 中,这在形式上是不允许的,您需要分别迭代每个子数组,因为迭代超出第一个子数组的后尾指针会导致 C 中的未定义行为。尽管如此,实际上这仍然有效。


小智 5

对于 C++,您可以使用算法头文件中的 std:fill 方法。

int a[x][y];
std::fill(a[0], a[0] + x * y, 0);
Run Code Online (Sandbox Code Playgroud)

所以,在你的情况下,你可以使用这个:

int a[100][200];
std::fill(a[0], a[0] + 100 * 200, 0);
Run Code Online (Sandbox Code Playgroud)

当然,可以为任何 int 值更改 0。


Wil*_*l A 2

memset(a, 0, 100 * 200 * sizeof(int));应该这样做。