If array
is truly an array, then you can "zero it out" with:
memset(array, 0, sizeof array);
But there are two points you should know:
- this works only if
array
is really a "two-d array", i.e., was declared T array[M][N];
for some type T
.
- it works only in the scope where
array
was declared. If you pass it to a function, then the name array
decays to a pointer, and sizeof
will not give you the size of the array.
Let's do an experiment:
#include <stdio.h>
void f(int (*arr)[5])
{
printf("f: sizeof arr: %zu\n", sizeof arr);
printf("f: sizeof arr[0]: %zu\n", sizeof arr[0]);
printf("f: sizeof arr[0][0]: %zu\n", sizeof arr[0][0]);
}
int main(void)
{
int arr[10][5];
printf("main: sizeof arr: %zu\n", sizeof arr);
printf("main: sizeof arr[0]: %zu\n", sizeof arr[0]);
printf("main: sizeof arr[0][0]: %zu\n\n", sizeof arr[0][0]);
f(arr);
return 0;
}
On my machine, the above prints:
main: sizeof arr: 200
main: sizeof arr[0]: 20
main: sizeof arr[0][0]: 4
f: sizeof arr: 8
f: sizeof arr[0]: 20
f: sizeof arr[0][0]: 4
Even though arr
is an array, it decays to a pointer to its first element when passed to f()
, and therefore the sizes printed in f()
are "wrong". Also, in f()
the size of arr[0]
is the size of the array arr[0]
, which is an "array [5] of int
". It is not the size of an int *
, because the "decaying" only happens at the first level, and that is why we need to declare f()
as taking a pointer to an array of the correct size.
So, as I said, what you were doing originally will work only if the two conditions above are satisfied. If not, you will need to do what others have said:
memset(array, 0, n*n*sizeof array[0][0]);
Finally, memset()
and the for
loop you posted are not equivalent in the strict sense. There could be (and have been) compilers where "all bits zero" does not equal zero for certain types, such as pointers and floating-point values. I doubt that you need to worry about that though.