Jika arraybenar-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
arraybenar-benar merupakan "larik dua-d", yaitu, dideklarasikan T array[M][N];untuk beberapa tipe T.
- ini hanya berfungsi dalam lingkup
arrayyang dideklarasikan. Jika Anda meneruskannya ke suatu fungsi, maka nama tersebut array meluruh menjadi penunjuk , dan sizeoftidak 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 arrmerupakan 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 forloop 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.