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