Se array
è veramente un array, puoi "azzerarlo" con:
memset(array, 0, sizeof array);
Ma ci sono due punti che dovresti sapere:
- funziona solo se
array
è realmente un "array a due d", cioè è stato dichiarato T array[M][N];
per qualche tipo T
.
- funziona solo nell'ambito in cui è
array
stato dichiarato. Se lo passi a una funzione, il nome array
decade in un puntatore e sizeof
non ti darà la dimensione dell'array.
Facciamo un esperimento:
#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;
}
Sulla mia macchina, quanto sopra stampa:
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
Anche se arr
è un array, decade in un puntatore al suo primo elemento quando viene passato a f()
, e quindi le dimensioni stampate f()
sono "sbagliate". Inoltre, nella f()
dimensione di arr[0]
è la dimensione dell'array arr[0]
, che è un "array [5] di int
". Non ha le dimensioni di un int *
, perché il "decadimento" avviene solo al primo livello, ed è per questo che dobbiamo dichiararef()
che prende un puntatore a un array della dimensione corretta.
Quindi, come ho detto, ciò che stavi facendo originariamente funzionerà solo se le due condizioni sopra sono soddisfatte. In caso contrario, dovrai fare ciò che gli altri hanno detto:
memset(array, 0, m*n*sizeof array[0][0]);
Infine, memset()
e il for
ciclo che hai postato non sono equivalenti in senso stretto. Potrebbero esserci (e sono stati) compilatori in cui "tutti i bit zero" non è uguale a zero per alcuni tipi, come puntatori e valori a virgola mobile. Dubito che tu debba preoccuparti di questo però.