Jeśli array
naprawdę jest tablicą, możesz ją wyzerować za pomocą:
memset(array, 0, sizeof array);
Ale są dwie kwestie, o których powinieneś wiedzieć:
- działa to tylko wtedy, gdy
array
naprawdę jest "tablicą dwuwymiarową", tj. została zadeklarowana T array[M][N];
dla jakiegoś typu T
.
- działa tylko w zakresie, w jakim
array
został zadeklarowany. Jeśli przekażesz to do funkcji, nazwa array
rozpadnie się na wskaźnik i sizeof
nie poda rozmiaru tablicy.
Zróbmy eksperyment:
#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 moim komputerze powyższe wydruki:
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
Mimo że arr
jest tablicą, po przekazaniu do jej pierwszego elementu rozpada się na wskaźnik f()
, dlatego drukowane rozmiary f()
są „niewłaściwe”. Również f()
rozmiar arr[0]
to rozmiar tablicy arr[0]
, która jest „tablicą [5] z int
”. Nie jest to rozmiar an int *
, ponieważ "zanikanie" ma miejsce tylko na pierwszym poziomie i dlatego musimy zadeklarować f()
jako wskaźnik do tablicy o odpowiednim rozmiarze.
Tak więc, jak powiedziałem, to, co robiłeś pierwotnie, zadziała tylko wtedy, gdy dwa powyższe warunki są spełnione. Jeśli nie, będziesz musiał zrobić to, co powiedzieli inni:
memset(array, 0, m*n*sizeof array[0][0]);
Wreszcie, memset()
a for
pętla zostanie zaksięgowana nie są równoważne w sensie ścisłym. Mogłyby istnieć (i były) kompilatory, w których „wszystkie bity zero” nie są równe zeru dla pewnych typów, takich jak wskaźniki i wartości zmiennoprzecinkowe. Wątpię jednak, żebyś musiał się tym martwić.