为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
达令说 2019-06-26 16:51:46
为什么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])。或者它还有其他我不知道的意思?
查看完整描述

4 回答

?
onemoo

TA贡献883条经验 获得超454个赞

语法设计上如此,编译器自然也要遵循这一规则了。

在使用中记住这一点就好了。  如果你一定要知道为什么当年 K&R 要设计成这样,那么...我也不知道。 不过从另一个角度想,为避免对数组参数额外的压栈开销,函数对数组参数的访问几乎都是以额外寻址的方式实现的,所以这样的设计从工程师角度来看是更符合直觉的。C语言本来就是源于工程实践的,也许这也是原因之一吧(猜)。

当然,有时候我们希望传递数组,并且希望函数对数组的访问不要越界。但因为 C 语言有这样的特性,所以很多函数在数组参数后还设计了一个整型参数。我想你应该能够猜到这个整型参数是做什么用的。对!就是让用户传入数组的大小,这样至少能让函数知道传入的数组有多大(以避免访问越界等)。


另外,C99 标准新增加了额外的语法,可以在声明函数时允许用户限定数组参数的最小容量

语法示例: int func(int a[static 10]);

关键就是那个 static,这样限定传入的数组必须至少能容纳 10 个元素。

PS. 这个新语法似乎用的不多,大家已经习惯了老方法。

PPS. 注意,C++ 并没有这个新用法。并且再强调下,尽管看起来很像,但一定要把 C 和 C++ 看作是两门不同的语言。C++ 看似像 C 的部分在语法上和 C 有着很多微妙的差异。

PPPS. 我怎么感觉前面几个回答都是机翻呢...


查看完整回答
反对 回复 2019-06-27
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

这是将数组传递给函数的语法的一个怪癖。

实际上,在C中传递数组是不可能的。如果您编写的语法看起来应该传递数组,那么实际发生的情况是传递一个指向数组第一个元素的指针。

由于指针不包含任何长度信息,因此[]在函数中,形式参数列表实际上被忽略了。


查看完整回答
反对 回复 2019-06-26
  • 4 回答
  • 0 关注
  • 620 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信