[英]Why isn't there an array length function in C?
C设计的一个指导原则是所有数据类型都直接映射到内存,并且尝试存储数组类型(如长度)的元数据与该哲学背道而驰。
从Dennis Ritchie的一篇文章描述C的发展,我们发现:
胚胎C.
...
这些语义代表了从B的简单过渡,我用它们进行了几个月的实验。 当我尝试扩展类型表示法时,问题变得明显,特别是添加结构化(记录)类型。 结构似乎应该以直观的方式映射到机器中的内存中,但是在包含数组的结构中,没有好地方存放包含数组底部的指针,也没有任何方便的方法来安排它。初始化。 例如,早期Unix系统的目录条目可能在C中描述我希望该结构不仅可以表征抽象对象,还可以描述可能从目录中读取的位集合。 编译器在哪里可以隐藏指向语义要求的名称的指针? 即使结构被认为更抽象,并且指针的空间可能以某种方式隐藏,我如何处理在分配复杂对象时正确初始化这些指针的技术问题,也许是指定包含包含任意深度结构的数组的结构? 该解决方案构成了无类型BCPL和类型C之间的进化链中的关键跳跃。它消除了存储中指针的实现,而是在表达式中提到数组名称时导致指针的创建。 在今天的C中存活的规则是,数组类型的值在表达式中出现时转换为指向构成数组的第一个对象的指针。struct { int inumber; char name[14]; };
强调我的。 在上面的段落中用“元数据”替换术语“指针”,我想我们可以回答你的问题。
除非这里的某个人恰好是C标准委员会的成员,否则你不可能得到权威的答案。 但我能想到的两个原因:
在许多(大多数?)情况下,你没有数组,你只有一个指针。
存储有关阵列的元数据会增加存储大小等.C的一般规则是您不为不使用的内容付费。
C不是面向对象的,因此它没有附加到对象的方法的概念。 它的设计考虑了速度和简单性,常见的成语sizeof (array) / sizeof(array[0])
简短而直接。
这取决于效率。 C是一种非常有效的编程语言。
C中的数组语法只是指针算术的语法糖。 如果你想拥有一个带有长度和边界检查的真实数组,你可以创建一个包含数组指针及其长度的结构,并且只能通过检查边界的函数来访问它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.