が本当に配列である場合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ループは厳密な意味では同等ではありません。ポインターや浮動小数点値などの特定の型について、「すべてのビットがゼロ」がゼロに等しくないコンパイラーが存在する可能性があります (存在していました)。私はあなたがそれについて心配する必要があるとは思わない。