Nếu array
thực sự là một mảng, thì bạn có thể "xóa nó" bằng:
memset(array, 0, sizeof array);
Nhưng có hai điểm bạn nên biết:
- điều này chỉ hoạt động nếu
array
thực sự là một "mảng hai-d", tức là, đã được khai báo T array[M][N];
cho một số kiểu T
.
- nó chỉ hoạt động trong phạm vi
array
đã được khai báo. Nếu bạn chuyển nó cho một hàm, thì tên array
sẽ phân rã thành một con trỏ và sizeof
sẽ không cung cấp cho bạn kích thước của mảng.
Hãy làm một thử nghiệm:
#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;
}
Trên máy của tôi, các bản in trên:
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
Mặc dù arr
là một mảng, nhưng nó phân rã thành một con trỏ đến phần tử đầu tiên của nó khi được chuyển đến f()
, và do đó kích thước được in ra f()
là "sai". Ngoài ra, trong f()
kích thước của arr[0]
là kích thước của mảng arr[0]
, là "mảng [5] của int
". Nó không phải là kích thước của một int *
, bởi vì "phân rã" chỉ xảy ra ở cấp độ đầu tiên, và đó là lý do tại sao chúng ta cần khai báo f()
là lấy một con trỏ đến một mảng có kích thước chính xác.
Vì vậy, như tôi đã nói, những gì bạn đang làm ban đầu sẽ chỉ hoạt động nếu hai điều kiện trên được thỏa mãn. Nếu không, bạn sẽ cần phải làm những gì người khác đã nói:
memset(array, 0, m*n*sizeof array[0][0]);
Cuối cùng, memset()
và for
vòng lặp bạn đã đăng không tương đương theo nghĩa chặt chẽ. Có thể có (và đã có) các trình biên dịch trong đó "tất cả các bit không" không bằng 0 đối với một số loại nhất định, chẳng hạn như con trỏ và giá trị dấu phẩy động. Tôi nghi ngờ rằng bạn cần phải lo lắng về điều đó.