หากarray
เป็นอาร์เรย์อย่างแท้จริงคุณสามารถ "ศูนย์ออก" ด้วย:
memset(array, 0, sizeof array);
แต่มีสองประเด็นที่คุณควรรู้:
- นี้ทำงานได้เฉพาะในกรณีที่
array
เป็นจริง "สอง-D อาร์เรย์" คือการประกาศสำหรับบางชนิด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] of int
" ไม่ใช่ขนาดของ an int *
เนื่องจาก "การสลายตัว" เกิดขึ้นที่ระดับแรกเท่านั้นและนั่นคือเหตุผลที่เราต้องประกาศf()
ว่านำตัวชี้ไปยังอาร์เรย์ที่มีขนาดที่ถูกต้อง
ดังที่ฉันได้กล่าวไปแล้วสิ่งที่คุณทำในตอนแรกจะใช้ได้ผลก็ต่อเมื่อเงื่อนไขทั้งสองข้างต้นเป็นที่พอใจ ถ้าไม่คุณจะต้องทำตามที่คนอื่นบอก:
memset(array, 0, m*n*sizeof array[0][0]);
สุดท้ายmemset()
และfor
ลูปที่คุณโพสต์ไม่เทียบเท่าในแง่ที่เข้มงวด อาจมีคอมไพเลอร์ (และเคยเป็น) โดยที่ "บิตทั้งหมดเป็นศูนย์" ไม่เท่ากับศูนย์สำหรับบางประเภทเช่นพอยน์เตอร์และค่าทศนิยม ฉันสงสัยว่าคุณต้องกังวลเกี่ยวกับเรื่องนี้