函数签名中的数组长度:令人困惑的异常
在 C 和 C 语言中,函数签名通常包含用方括号括起来的数组长度,例如如示例所示:
int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; }
但是,此语法似乎有没有实际效果,如上述代码成功访问超出数组声明长度的元素的事实所示。这就提出了一个问题:为什么编译器允许这种看似多余的符号?
答案在于 C 和 C 中数组处理的实现细节。 C 和 C 中的数组本质上是指向数组第一个元素的地址。当一个数组被传递给一个函数时,它的地址被复制,有效地传递了一个指针。
在上面的例子中,函数 dis 接受一个声明长度为 1 的字符数组 a。数组作为指针传递,长度规范无关紧要,即使索引超过声明的长度,函数也可以访问数组的任何元素。
参数语法中的这种不一致一直是一个问题自从这些语言早期引入以来,争论了几十年。虽然一些人主张更一致的语法,但另一些人则将与遗留代码的兼容性作为维持当前行为的原因。
尽管它可能会导致混乱,但对函数签名中具有未指定长度的数组的容忍是一个副产品C 和 C 中基于指针的数组实现。它提醒人们不同语言特征之间的相互作用可能产生的细微差别。
以上是为什么 C 和 C 函数签名允许无效的数组长度?的详细内容。更多信息请关注PHP中文网其他相关文章!