Якщо 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
". Це не розмір an int *
, тому що "загнивання" відбувається лише на першому рівні, і саме тому нам потрібно заявитиf()
, що бере вказівник на масив правильного розміру.
Отже, як я вже казав, те, що ви робили спочатку, працюватиме лише за умови, якщо будуть виконані дві наведені вище умови. Якщо ні, то вам потрібно буде зробити те, що сказали інші:
memset(array, 0, m*n*sizeof array[0][0]);
Нарешті, memset()
і for
цикл, який ви опублікували, не є рівнозначним у строгому сенсі. Могли бути (і були) компілятори, де "всі біти нуль" не дорівнює нулю для певних типів, таких як покажчики та значення з плаваючою комою. Я сумніваюся, що вам потрібно про це переживати.