Jika array
benar-benar sebuah larik, maka Anda dapat "memboloskannya" dengan:
memset(array, 0, sizeof array);
Tetapi ada dua hal yang harus Anda ketahui:
- ini hanya berfungsi jika
array
benar-benar merupakan "larik dua-d", yaitu, dideklarasikan T array[M][N];
untuk beberapa tipe T
.
- ini hanya berfungsi dalam lingkup
array
yang dideklarasikan. Jika Anda meneruskannya ke suatu fungsi, maka nama tersebut array
meluruh menjadi penunjuk , dan sizeof
tidak akan memberi Anda ukuran larik.
Mari lakukan percobaan:
#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;
}
Di mesin saya, cetakan di atas:
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
Meskipun arr
merupakan sebuah array, ia meluruh ke pointer ke elemen pertamanya saat diteruskan f()
, dan oleh karena itu ukuran yang dicetak f()
adalah "salah". Juga, dalam f()
size of arr[0]
adalah ukuran dari array arr[0]
, yang merupakan "array [5] dari int
". Ini bukan ukuran an int *
, karena "peluruhan" hanya terjadi pada tingkat pertama, dan itulah mengapa kita perlu mendeklarasikan f()
sebagai mengambil pointer ke array dengan ukuran yang benar.
Jadi, seperti yang saya katakan, apa yang Anda lakukan awalnya hanya akan berhasil jika kedua kondisi di atas terpenuhi. Jika tidak, Anda perlu melakukan apa yang orang lain katakan:
memset(array, 0, m*n*sizeof array[0][0]);
Akhirnya, memset()
dan for
loop yang Anda posting tidak setara dalam arti sebenarnya. Mungkin ada (dan telah ada) kompiler di mana "semua bit nol" tidak sama dengan nol untuk jenis tertentu, seperti pointer dan nilai floating-point. Saya ragu Anda perlu mengkhawatirkan hal itu.