Si array
est vraiment un tableau, alors vous pouvez le "remettre à zéro" avec:
memset(array, 0, sizeof array);
Mais il y a deux points que vous devez savoir:
- cela ne fonctionne que si
array
est vraiment un "tableau à deux d", c'est-à-dire a été déclaré T array[M][N];
pour un type T
.
- cela ne fonctionne que dans la portée où a
array
été déclaré. Si vous le passez à une fonction, le nom array
se désintègre en pointeur et sizeof
ne vous donnera pas la taille du tableau.
Faisons une expérience:
#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;
}
Sur ma machine, les impressions ci-dessus:
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
Même s'il arr
s'agit d'un tableau, il se désintègre en un pointeur vers son premier élément lorsqu'il est passé à f()
, et par conséquent, les tailles imprimées f()
sont "incorrectes". En outre, f()
la taille de arr[0]
est la taille du tableau arr[0]
, qui est un "tableau [5] de int
". Ce n'est pas la taille d'un int *
, parce que la "décomposition" ne se produit qu'au premier niveau, et c'est pourquoi nous devons déclarer f()
comme prenant un pointeur vers un tableau de taille correcte.
Donc, comme je l'ai dit, ce que vous faisiez à l'origine ne fonctionnera que si les deux conditions ci-dessus sont remplies. Sinon, vous devrez faire ce que les autres ont dit:
memset(array, 0, m*n*sizeof array[0][0]);
Enfin, memset()
et la for
boucle que vous avez postée ne sont pas équivalentes au sens strict. Il pourrait y avoir (et il y a eu) des compilateurs où «tous les bits à zéro» n'est pas égal à zéro pour certains types, tels que les pointeurs et les valeurs à virgule flottante. Je doute que vous ayez à vous en préoccuper.