C では、関数パラメーター内の配列は非常に奇妙な動作をします。率直に言って、ここでの言語の設計は非常にまずかったと思います。
void foo(int data[10]) {
int *p;
int a[10];
}
sizeof(p)
おそらく 4 (あるいは 8) になるでしょう。そしてsizeof(a)
40(または80)になります。
では、どうなると思いsizeof(data)
ますか?40 (または 80) だと思ったら大間違いです。代わりに、そのサイズは と同じsizeof(p)
です。
C コンパイラ[
がパラメータ名の直後に a を見た場合、それを削除してポインタに置き換え、 にdata[10]
なり*data
ます。(これは、他の場所の配列で得られる減衰動作とは異なります。パラメーターの場合、配列はより大幅に処理されます)。
実際、配列のサイズが異なっていても、以下はコンパイルされます。
int foo(int data[10]);
int main() {
int hugearray[1000];
foo(hugearray); // this compiles!
}
C コンパイラは、配列パラメーターのサイズを考慮しません。*
コンパイラは配列パラメータに対して警告を発し、直接使用することを奨励すべきだと私は信じています。を許可するかもしれませんが、コンパイラによって無視されることを考えると[]
、確かにそうではありません。[10]
C コンパイラで配列のサイズを考慮したい場合は、配列のアドレスを渡す必要があります。
int foo(int (*data)[10]);
int main() {
int smallarray[10];
foo(&smallarray); // OK
int hugearray[1000];
foo(&hugearray); // error, as desired
}
元の質問に戻ると、パラメーター配列はそのサイズについて何も知りません。