2010-08-27 72 views
9

我有一个2D和我想设置的元素为零不用循环的所有元素填写多维数组元素用0

int a[100][200]; 

我不能在声明的点初始化它们。

+3

为什么你不能在声明的时候初始化它们? – 2010-08-27 17:44:50

+0

你想在课堂上申报吗? – cpx 2010-08-27 18:06:59

回答

2

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

13

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

这简单地将覆盖使用由阵列与0字节的存储器。除非你真的知道你做什么,否则不要为用户定义的数据类型执行此操作。还有std::fillstd::fill_n,这是更多的C++ ISH(但不是这里最简单的方法)。

+2

即使对于非用户定义的数据类型,这可能会产生意想不到的结果。数据成员指针是一个在GCC和Clang(“Itanium ABI”)使用的C++-ABI中使用非0×0空指针编码的示例 - 它们使用全1位。对于“int”,这应该没问题。 – 2010-08-27 20:55:04

+0

不应该在这里使用'sizeof(a)* sizeof(int)'吗? – Mikhail 2012-12-02 22:45:43

+2

不,数组sizeof以字节返回正确的大小,因此不需要乘以int大小。 – 2012-12-03 02:18:23

1

如果这个数组是在文件范围声明的,或者在函数范围内声明为'static',那么它会自动初始化为零,你不必做任何事情。这只适用于一个在程序启动时的初始化;如果你需要重置它,你必须自己编码。我会使用memset

如果它在不带静电的功能范围内声明的,你需要使用memset,或显式的初始化 - 单= { 0 }是不够的,你不需要写出所有200个零喜欢别人建议。

+0

还应该补充说明静态变量与非静态声明的变量的语义是非常不同的。声明为静态的变量固有地声明一个状态;这可能不是OP想要的。我同意memset方法(或明确的初始化方法)。 – Schedler 2010-08-27 18:04:33

23

尝试

int a[100][200] = {{0}}; 

如果初始化一些(但不是全部)的元素,其余的将被初始化为零。在这里,你只是明确地初始化第一个子数组的第一个元素,编译器正在处理其余的部分。

+1

+1'= {0}'也应该有效,但这可能会更好地避免编译器警告。 – Potatoswatter 2010-08-27 20:30:25

+12

为了缩短它,C++允许'= {};'。 – 2010-08-27 20:45:12

1

“我无法在声明点初始化”是什么意思? “不知道如何”?或者“不能修改那里的代码”?

C++语言的特征在于在声明点

int a[100][100] = {}; 

初始化整个阵列为0(注意,没有明确0{}之间确实需要)。你可以使用它吗?

如果不能,那么你的选择是:使用memset -hack,1D-重新解释,黑客或通过数组(S)迭代(有或没有帮助FO std::fill)设置的每个元素明确。

+0

声明时的初始化是被禁止的,例如,当goto或switch切换到声明中时,就会将其转换为变量的作用域。 – Potatoswatter 2017-02-06 02:05:43

0

提到的memset方法(memset(a,0,sizeof(a));)会起作用,但是如何使用C++方式(根据您的标记)以及使用向量?

std::vector<std::vector<int> > a; 
a.assign(100, std::vector<int>(200)); 
3

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

std::fill(a[0] + 0, a[99] + 100, 0); 

在C,这是正式不允许的,你需要通过每个单独子阵列迭代,因为迭代超越了第一子阵列的过去,在C指针导致C中未定义的行为尽管如此,实际上这仍然有效。

+0

这仍然是真的吗? (是否曾经?) – Potatoswatter 2017-02-06 02:04:31

0

我测试了这个解决方案,它工作。

int arr[100][200]; 

for (int i=0; i<100; i++) 
    for (int j=0; j<200; j++) (arr[i][j] = 0); 

for (int i=0; i<100; i++) 
    for (int j=0; j<200; j++) cout << (arr[i][j]); 
2

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

int a[x][y]; 
std::fill(a[0], a[0] + x * y, 0); 

所以,你的情况,你可以这样做:

int a[100][200]; 
std::fill(a[0], a[0] + 100 * 200, 0); 

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

0

许多答案使用指针运算与fill。这是可以做到简单:

int a[N][K]; 
fill(a[0], a[N], 0); 

基本上,a[N]是多维数组后第一个内存地址,不管有多少尺寸也有。这工作太:

int a[N][K][L][M]; 
fill(**a[0], **a[N], 0); 

这里的星号解引用指针下降到int*类型(数组括号解引用int****int***,两个星号做工作的其余部分)。