为什么C函数不能返回数组类型?

use*_*620 3 c arrays return return-type

我是C语言的新手,我想知道:

为什么C函数不能返回数组类型?

我知道数组名称是数组第一个值的地址,而数组是C语言中的二等公民.

M.M*_*M.M 8

你已经自己回答了这个问题:阵列是二等公民.

C按值返回.数组不能通过值传递,因此无法返回它们.

至于为什么数组不能通过值传递:这是K&R在他们第一次设计语言时做出的设计决定,现在改变它已经太晚了,因为所有现有的C代码都会破坏.


Bar*_*mar 8

基于C语言的发展,看起来真正的原因主要与B和BCPL的C演变有关.B没有数组变量,只有指针.它也没有结构.当结构被添加到C,并且允许它们包含数组成员时,他需要一种方法来处理这些封闭的数组,类似于处理B样式数组的方式,并且解决方案是让数组在任何时候转换为指针.在表达式中重复使用.以下是本文解释这一点的部分.

当我尝试扩展类型表示法时,问题变得明显,特别是添加结构化(记录)类型.结构似乎应该以直观的方式映射到机器中的内存中,但是在包含数组的结构中,没有好地方存放包含数组底部的指针,也没有任何方便的方法来安排它.初始化.例如,早期Unix系统的目录条目可能在C中描述

struct {
     int inumber;
     char name[14];
  };
Run Code Online (Sandbox Code Playgroud)

我希望该结构不仅可以表征抽象对象,还可以描述可能从目录中读取的位集合.编译器在哪里可以隐藏指向语义要求的名称的指针?即使结构被认为更抽象,并且指针的空间可能以某种方式隐藏,我如何处理在分配复杂对象时正确初始化这些指针的技术问题,也许是指定包含包含任意深度结构的数组的结构?

该解决方案构成了无类型BCPL和类型C之间的进化链中的关键跳跃.它消除了存储中指针的实现,而是在表达式中提到数组名称时导致指针的创建.在今天的C中存活的规则是,数组类型的值在表达式中出现时转换为指向构成数组的第一个对象的指针.

这不是特定于将数组传递给函数和从函数传递数组,它适用于表达式中使用数组的任何时候(除非它是&运算符的参数).

另请注意,此设计允许malloc()在传递给函数时对数组变量和动态分配的内存进行等效处理.


Joh*_*ode 5

无法从函数返回数组的原因是数组类型可能不是赋值的目标。你不能写这样的东西

int arr[N];
arr = foo();
Run Code Online (Sandbox Code Playgroud)

当数组表达式出现在大多数上下文中时,它们就会失去其“数组性”。这是 Ritchie 在 C 开发早期做出的设计决策的结果。C 源自一种称为 B(围棋)的早期编程语言,而 B 又源自 BCPL。在 B 中,数组对象指向数组第一个元素的指针,数组访问是根据指针算术定义的。 a[i]被定义为*(a + i);- 距存储地址的偏移i 元素a并取消引用结果。

Ritchie 保留了 B 的数组语义,但不想保留这些语义所需的指针存储。因此,他提出了在大多数情况下数组表达式将转换(“衰减”)为指针表达式的规则。

这意味着arr = foo();如果是数组类型则无法工作arr,因为没有为arr与数组元素本身分开命名的对象预留存储空间;没有什么可分配给 的