在 C 和 C 中,函数签名可能包含方括号中的数组长度,例如 int a[ 1]。然而,这种行为让开发人员感到困惑,因为长度似乎没有实际效果。
考虑以下示例:
#include <iostream> int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
在此代码中,函数 dis 声明了一个数组参数长度为 1 (a[1]),但仍然可以访问 a[2]。这就提出了一个问题:如果不强制执行,为什么编译器允许在函数签名中使用数组长度?
答案在于 C/ 中数组传递的独特行为C.与许多其他语言不同,C 和 C 不允许将数组直接传递给函数。相反,传递的是指向数组第一个元素的指针。
因此,函数签名中指定的数组长度变得无关紧要。指针中不包含长度信息,因此编译器会忽略括号中的长度。
此行为源于 20 世纪 70 年代 C 开发早期阶段做出的决定。尽管多年来它引起了混乱,但该语法在 C 和 C 中仍然很流行。
数组传递的这种怪癖有几个含义:
以上是为什么编译器会忽略 C/C 函数签名中的数组长度?的详细内容。更多信息请关注PHP中文网其他相关文章!