Jeśli arraynaprawdę 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
arraynaprawdę jest "tablicą dwuwymiarową", tj. została zadeklarowana T array[M][N];dla jakiegoś typu T.
- działa tylko w zakresie, w jakim
arrayzostał zadeklarowany. Jeśli przekażesz to do funkcji, nazwa array rozpadnie się na wskaźnik i sizeofnie 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 arrjest 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 forpę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ć.