为何C语言不能返回数组

2019-02-02 19:36

为何C语言不能返回数组



  有时想直接返回一个数组的时候,真的有很多麻烦事。为什么不可以直接返回数组呢?

  从编译结果来说,不管是基本类型变量也好、数组也好、结构体联合体对象也罢,最终都会被翻译成一个地址,对应一块内存空间。通过一个地址访问一块内存空间,并根据不同的数据类型读写这块内存空间,数据类型决定了读写的长度和格式。基本类型(char int float double)还有结构体联合体类型,读写操作都可以针对整块内存空间,可以直接赋值a = b,而数组的读写操作却是分段的,C语言没有提供arrA = arrB这种操作。

  那么如果C语言实现了arrA = arrB的操作会怎么样呢?要知道函数执行过程中,大概是先在栈顶开辟了空间存储参数,再在栈顶开辟空间存储返回值,还要在栈顶开辟空间存储局部变量和其他内容,被调用函数执行完毕后,栈中相关内容相继弹出,返回值在赋值结束后也被弹出,然后参数被弹出,至此一个函数占用的空间全部释放。

  那么在此过程中,你首先要在声明一个数组arr,用于接收函数返回值arr = fun(),然后你要在函数体内定义一个局部tmpArr数组并返回tmpArr,而为了返回这个数组系统需要再开辟一个返回值空间存储你的return tmpArr,也就是说你只是想要返回一个数组,一来二去却用了3个数组空间,并且你必须保证这三个空间规格相同,分毫不差。一方面使编译器处理更加复杂,另一方面资源消耗的更多了,并且重复的赋值操作降低了运算效率。从这几点上来看,支持返回数组的功能是不是显得很鸡肋呢?

  其实C语言已经提供了很方便的方式,就是直接将数组arr的地址传递给函数,然后函数直接用传入地址访问arr的空间进行读写操作,函数本身不关心你传入的数组有多少元素,一切取决于被调用者与调用者之间的约定。从道理上来说,结构体对象也可以用这样的方式返回结果 fun(可以大大提高效率。

  结果是就算让函数返回数组,也没有数组对象能接受返回值。类似地,照原样传递数组参数也因此不可行。