为什么C中没有数组长度函数?

时间:2012-03-24 12:23:18

标签: c arrays

虽然有various种方法可以在C中找到数组的长度,但语言并没有提供。

在C或其任何修订中不包括这种常见操作的原因是什么?

5 个答案:

答案 0 :(得分:7)

C设计的一个指导原则是所有数据类型都直接映射到内存,并且尝试存储数组类型(如长度)的元数据与该哲学背道而驰。

Dennis Ritchie的article描述了C的发展,我们发现:

胚胎C
...
这些语义代表了从B的简单过渡,我用它们进行了几个月的实验。当我尝试扩展类型表示法时,问题变得明显,特别是添加结构化(记录)类型。结构似乎应该以直观的方式映射到机器中的内存中,但是在包含数组的结构中,没有好地方存放包含数组底部的指针,也没有任何方便的方法来安排它。初始化。例如,早期Unix系统的目录条目可能在C中描述

    struct {
        int     inumber;
        char    name[14];
    };
我希望结构不仅可以表征抽象对象,还可以描述可能从目录中读取的位集合。编译器在哪里可以隐藏指向语义所需命名的指针?即使结构被认为更抽象,并且指针的空间可能以某种方式隐藏,我如何处理在分配复杂对象时正确初始化这些指针的技术问题,也许是指定包含包含任意深度结构的数组的结构? 该解决方案构成了无类型BCPL和类型C之间的进化链中的关键跳跃。它消除了存储中指针的实现,而是在表达式中提到数组名称时导致指针的创建。在今天的C中存活的规则是,数组类型的值在表达式中出现时转换为指向构成数组的第一个对象的指针。

强调我的。只需在上面的段落中将“指针”替换为“元数据”,我想我们就可以回答你的问题。

答案 1 :(得分:4)

除非此处有人出现在C标准委员会,否则您不太可能获得权威答案。但我能想到的两个原因是:

  1. 在很多(大多数?)情况下,你没有数组,你只有一个指针。

  2. 存储有关阵列的元数据会增加存储空间等.C的一般规则是您不为不使用的内容付费。

答案 2 :(得分:1)

C不是面向对象的,因此它没有附加到对象的方法的概念。它的设计考虑了速度和简单性,常见的成语sizeof (array) / sizeof(array[0])简短明了。

答案 3 :(得分:0)

效率低下。 C是一种非常有效的编程语言。

答案 4 :(得分:0)

C中的数组语法只是指针算术的语法糖。如果你想拥有一个带有长度和边界检查的真实数组,你可以创建一个包含数组指针及其长度的结构,并且只能通过检查边界的函数来访问它。