경우 array
진정으로 배열입니다, 당신은 함께 "그것을 밖으로 제로"할 수 있습니다 :
memset(array, 0, sizeof array);
그러나 알아야 할 두 가지 사항이 있습니다.
- 이것은
array
실제로 "2 차원 배열"인 경우에만 작동합니다 . 즉, 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()
의 크기 는 "array [5] of "인 arr[0]
배열의 크기입니다 . "감쇠"는 첫 번째 수준에서만 발생하기 때문에 의 크기가 아니므 로 올바른 크기의 배열에 대한 포인터를 사용하는 것으로 선언해야합니다 .arr[0]
int
int *
f()
그래서 제가 말했듯이, 당신이 원래하던 일은 위의 두 가지 조건이 충족 되어야만 작동 할 것입니다. 그렇지 않은 경우 다른 사람이 말한대로해야합니다.
memset(array, 0, m*n*sizeof array[0][0]);
마지막으로 게시 memset()
한 for
루프는 엄격한 의미에서 동일하지 않습니다. 포인터 및 부동 소수점 값과 같은 특정 유형에 대해 "모든 비트 0"이 0이 아닌 컴파일러가있을 수 있습니다. 나는 당신이 그것에 대해 걱정할 필요가 있는지 의심합니다.