为什么C和C+编译器允许函数签名中的数组长度不被强制执行?

为什么C和C+编译器允许函数签名中的数组长度不被强制执行?

这是我在学习期间发现的:

#include<iostream>using namespace std;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;}

所以在变量中int dis(char a[1])[1]似乎什么也不做
因为我可以用a[2]..就像int a[]char *a..我知道数组名是一个指针,以及如何传递数组,所以我的困惑不是关于这个部分。

我想知道的是编译器为什么允许这种行为(int a[1])。或者它还有其他我不知道的意思?


达令说
浏览 628回答 4
4回答

onemoo

语法设计上如此,编译器自然也要遵循这一规则了。在使用中记住这一点就好了。  如果你一定要知道为什么当年 K&R 要设计成这样,那么...我也不知道。 不过从另一个角度想,为避免对数组参数额外的压栈开销,函数对数组参数的访问几乎都是以额外寻址的方式实现的,所以这样的设计从工程师角度来看是更符合直觉的。C语言本来就是源于工程实践的,也许这也是原因之一吧(猜)。当然,有时候我们希望传递数组,并且希望函数对数组的访问不要越界。但因为 C 语言有这样的特性,所以很多函数在数组参数后还设计了一个整型参数。我想你应该能够猜到这个整型参数是做什么用的。对!就是让用户传入数组的大小,这样至少能让函数知道传入的数组有多大(以避免访问越界等)。另外,C99 标准新增加了额外的语法,可以在声明函数时允许用户限定数组参数的最小容量。语法示例: int func(int a[static 10]);关键就是那个 static,这样限定传入的数组必须至少能容纳 10 个元素。PS. 这个新语法似乎用的不多,大家已经习惯了老方法。PPS. 注意,C++ 并没有这个新用法。并且再强调下,尽管看起来很像,但一定要把 C 和 C++ 看作是两门不同的语言。C++ 看似像 C 的部分在语法上和 C 有着很多微妙的差异。PPPS. 我怎么感觉前面几个回答都是机翻呢...

鸿蒙传说

这是将数组传递给函数的语法的一个怪癖。实际上,在C中传递数组是不可能的。如果您编写的语法看起来应该传递数组,那么实际发生的情况是传递一个指向数组第一个元素的指针。由于指针不包含任何长度信息,因此[]在函数中,形式参数列表实际上被忽略了。
打开App,查看更多内容
随时随地看视频慕课网APP