在 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
}
回到最初的问题,参数数组对它们的大小一无所知。