在C中,struct
(记录数据结构)可以是函数的返回类型,但数组不能。 C语言的哪些设计特性会导致数组异常?
答案 0 :(得分:7)
C语言中的裸数组类型由于主要历史原因而无法复制。因此,无法使用数组初始化数组,将数组分配给数组,按值传递数组作为参数或从函数返回数组。 (初始化上下文有一个值得注意的例外char s[6] = "Hello";
。)
如果数组包含在struct类型中,仍然可以执行上述所有操作,这表明该限制本质上是纯粹的声明性的。没有令人信服的技术理由。
C语言继承了其历史前辈--B和BCPL语言的数组实现方法。在B / BCPL中,数组是作为指针公开实现的,这意味着尝试将一个数组分配给另一个数组实际上表示了指针的赋值。 C语言采用了不同的方法。在C数组中不是指针,但C数组的接口规范与B / BCPL的表面保持表面兼容。 C中的数组仍然是"假装"在大多数情况下都是指针。这是他们无法立即复制的原因之一。
答案 1 :(得分:6)
最明显的是,"缺乏"是C不允许函数返回数组类型的结果。这在语言标准中明确说明。
在某种意义上,数组类型是C语言中的二等公民。在大多数情况下,数组类型的表达式被隐式转换为指向其第一个元素的指针。例外情况是当数组表达式是sizeof
的操作数(产生数组的大小)时,它是一元&
的操作数(产生数组的地址) ,以及它在用于初始化数组对象的初始化程序中的字符串文字。
这绝对不意味着数组是"真的"指针;他们不是。你会看到有人声称他们是。他们错了。
函数返回值。您可以拥有结构类型的值;该值由其成员的值组成。 C允许结构类型的赋值,参数传递和函数结果。所有这些都操纵数组值(它们按值处理,而不是通过引用处理)。
对于数组而言,情况并非如此。我上面提到的规则意味着你不能构造一个 value 属于数组类型的表达式。有数组值(由所有数组元素的值组成),但这些值很难或不可能直接操作。
C代码通常操作数组的方式是使用指向各个元素的指针。
设计C可能不会太困难,因此固定大小的数组可以被视为值,具有赋值,参数传递等等。但是,当int[10]
和int[11]
是两种截然不同且不兼容的类型时,您会遇到问题。处理数组的大多数C代码需要处理大小在运行时确定的数组。例如,<string.h>
中的字符串函数处理任意长度的字符数组。它们通过使用指向数组元素的指针来实现。你不可能为1元素,2元素,3元素等数组提供不同的函数。
你可以做的相当于从一个函数返回一个数组值,但不幸的是它很尴尬。您可以返回包含该数组的结构 - 但是必须在编译时修复该数组的大小。您可以返回指向数组(的第一个元素)的指针 - 但是您必须处理分配和释放内存以保存数组。您可以让调用者传入指向数组的指针 - 但这会给调用者带来内存管理的负担。等等。
是的,一切都搞得一团糟。但处理可能大小不同的阵列确实很困难。 C为您提供了执行此操作所需的所有工具,但为程序员提供了大量详细的管理。 (其他语言提供数组作为一流类型。其中许多语言都有用C语言编写的编译器或解释器。)
建议阅读:comp.lang.c FAQ的第6部分。
答案 2 :(得分:1)
特点是,在小而快速的C语言中,您不希望在返回时等效于大memcpy
次操作。如果您非常需要返回的数组,请将它们作为struct
的成员,然后在C中返回数组。排序,从C89开始: - )
或者在您需要的时间和地点自己使用memcpy
。
答案 3 :(得分:-3)
虽然不能从C函数返回数组,但是指向数组的指针可以。有关如何执行您要查找的内容的代码示例,请访问该站点:
http://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htm