Если 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
цикл вы вывесили не эквивалентны в строгом смысле этого слова. Могут быть (и были) компиляторы, в которых «все нулевые биты» не равны нулю для определенных типов, таких как указатели и значения с плавающей запятой. Я сомневаюсь, что вам стоит об этом беспокоиться.