Если array
действительно массив, то вы можете обнулить его с помощью:
memset(array, 0, sizeof array);
Но есть два момента, которые вы должны знать:
- это работает, только если
array
действительно является "двумерным массивом", т.е. было объявлено T array[M][N];
для некоторого типа T
.
- работает только в области, где было объявлено
array
. Если вы передадите его в функцию, то имя array
распадется на указатель , и sizeof
не даст вам размер массива.
Давайте проведем эксперимент:
#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;
}
На моей машине выше напечатано:
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
Несмотря на то, что arr
является массивом, при передаче в f()
он распадается на указатель на свой первый элемент, и поэтому размеры, напечатанные в f()
, являются «неправильными». Кроме того, в f()
размер arr[0]
равен размеру массива arr[0]
, который представляет собой «массив [5] из int
». Это не размер int *
, потому что «распад» происходит только на первом уровне, и поэтому мы должны объявить f()
как указатель на массив правильного размера.
Итак, как я уже сказал, то, что вы делали изначально, будет работать, только если выполнены два вышеуказанных условия. Если нет, вам нужно будет сделать то, что сказали другие:
memset(array, 0, m*n*sizeof array[0][0]);
Наконец, memset()
и опубликованный вами цикл for
не являются в строгом смысле эквивалентными. Могут быть (и были) компиляторы, в которых «все биты ноль» не равны нулю для определенных типов, таких как указатели и значения с плавающей точкой. Я сомневаюсь, что вам нужно об этом беспокоиться.