Se array
for realmente uma matriz, você pode "zerá-la" com:
memset(array, 0, sizeof array);
Mas há dois pontos que você deve saber:
- isso funciona apenas se
array
for realmente um "array two-d", ou seja, foi declarado T array[M][N];
para algum tipo T
.
- ele funciona apenas no escopo em que
array
foi declarado. Se você passá-lo para uma função, o nome array
decairá para um ponteiro e sizeof
não fornecerá o tamanho do array.
Vamos fazer um experimento:
#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;
}
Na minha máquina, as impressões acima:
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
Mesmo sendo arr
um array, ele decai para um ponteiro para seu primeiro elemento quando passado para f()
e, portanto, os tamanhos impressos f()
são "errados". Além disso, f()
o tamanho de arr[0]
é o tamanho da matriz arr[0]
, que é uma "matriz [5] de int
". Não é o tamanho de um int *
, porque o "decaimento" só acontece no primeiro nível, e é por isso que precisamos declarar f()
como levando um ponteiro para um array de tamanho correto.
Portanto, como eu disse, o que você estava fazendo originalmente só funcionará se as duas condições acima forem satisfeitas. Caso contrário, você precisará fazer o que outros disseram:
memset(array, 0, m*n*sizeof array[0][0]);
Finalmente, memset()
e o for
loop que você postou não são equivalentes no sentido estrito. Pode haver (e tem havido) compiladores onde "todos os bits zero" não são iguais a zero para certos tipos, como ponteiros e valores de ponto flutuante. Duvido que você precise se preocupar com isso.