が本当に配列である場合array
は、次の方法で「ゼロにする」ことができます。
memset(array, 0, sizeof array);
ただし、知っておくべき 2 つのポイントがあります。
- これは、
array
が実際に「2 次元配列」である場合、つまりT array[M][N];
何らかの typeに対して宣言されている場合にのみ機能し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] int
」です。int *
「減衰」は最初のレベルでのみ発生するため、これは のサイズではありません。そのf()
ため、正しいサイズの配列へのポインターを取得すると宣言する必要があります。
ですから、先ほど言ったように、あなたが本来行っていたことが機能するのは、上記の 2 つの条件が満たされた場合に限られます。そうでない場合は、他の人が言ったことを行う必要があります。
memset(array, 0, m*n*sizeof array[0][0]);
最後に、投稿memset()
したfor
ループは厳密な意味では同等ではありません。ポインターや浮動小数点値などの特定の型について、「すべてのビットがゼロ」がゼロに等しくないコンパイラーが存在する可能性があります (存在していました)。私はあなたがそれについて心配する必要があるとは思わない。