Si array
es realmente una matriz, entonces se puede "VACIARLA" con:
memset(array, 0, sizeof array);
Pero hay dos puntos que debe saber:
- Esto funciona sólo si
array
es realmente una "matriz de dos d", es decir, fue declarada T array[M][N];
para algún tipo T
.
- funciona solo en el alcance donde se declaró
array
. Si lo pasa a una función, el nombre array
decays to a pointer y sizeof
no le dará el tamaño de la matriz.
Vamos a hacer un 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;
}
En mi máquina, las impresiones anteriores:
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
Aunque arr
es una matriz, que se descompone a un puntero a su primer elemento cuando pasó a f()
, y por lo tanto los tamaños impresos en f()
son "incorrectos". Además, en f()
el tamaño de arr[0]
es el tamaño de la matriz arr[0]
, que es una "matriz [5] de int
". No tiene el tamaño de int *
, porque el "decaimiento" solo ocurre en el primer nivel, y es por eso que tenemos que declarar f()
como tomar un puntero a una matriz del tamaño correcto.
Por lo tanto, como dije, lo que estaba haciendo originalmente solo funcionará si se cumplen las dos condiciones anteriores. Si no es así, tendrá que hacer lo que otros han dicho:
memset(array, 0, m*n*sizeof array[0][0]);
Por último, memset()
y el bucle for
informados no son equivalentes en el sentido estricto. Podría haber (y ha habido) compiladores donde "todos los bits cero" no es igual a cero para ciertos tipos, como los punteros y los valores de coma flotante. Sin embargo, dudo que tengas que preocuparte por eso.
i y j debe ser n – Skizz
@Skizz: Gracias! –
Parece que no funciona. Me aparece el 'proceso devuelto -1073741819' en bloques de código, que es un fallo seg ¿no? – Eddy