如果array
确实是一个数组,那么您可以使用以下命令将其“归零”:
memset(array, 0, sizeof array);
但是有两点你应该知道:
- 仅当
array
它确实是“二维数组”时才有效,即为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()
size 中arr[0]
是数组的大小arr[0]
,它是“数组 [5] of int
”。它不是 a 的大小int *
,因为“衰减”只发生在第一级,这就是为什么我们需要声明f()
一个指向正确大小数组的指针。
因此,正如我所说,只有满足上述两个条件,您最初所做的事情才会起作用。如果没有,您将需要按照其他人所说的进行:
memset(array, 0, m*n*sizeof array[0][0]);
最后,您发布memset()
的for
循环在严格意义上并不等同。对于某些类型(例如指针和浮点值),可能存在(并且曾经存在过)“所有位为零”不等于零的编译器。我怀疑你是否需要担心这一点。