Se arrayfor 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
arrayfor realmente um "array two-d", ou seja, foi declarado T array[M][N];para algum tipo T.
- ele funciona apenas no escopo em que
arrayfoi declarado. Se você passá-lo para uma função, o nome array decairá para um ponteiro e sizeofnã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 arrum 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 forloop 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.