按值传递和返回结构(带有数组成员)

Posted

技术标签:

【中文标题】按值传递和返回结构(带有数组成员)【英文标题】:Passing and returning structures (with array members) by value 【发布时间】:2012-11-03 05:00:50 【问题描述】:

我知道,在 C 语言中,您可以按值传递(或返回)结构,但不能按值传递数组。当结构包含数组时会发生什么?当结构按值传递(或返回)时,数组(在结构内)是否会被复制?我已经运行 a sample at ideone.com 并且它有效,但我想知道标准中的哪个位置(是的,我已经看过了)。

http://open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

typedef struct

    float aValue;
    int anArray[5];
 myStruct;

myStruct addValueToArray(myStruct in)

    myStruct out = in;

    int i;
    for (i = 0; i < 5; i++)
    
        out.anArray[i] = in.anArray[i] + in.aValue;
    

    return out;

【问题讨论】:

struct 中包装数组是按值传递数组的常用方法。 【参考方案1】:

是的,它将被复制。整个结构是一个值,所以它可以传递给一个函数,返回,并且(许多人似乎忘记了这一点,但你使用它,很好!)分配。

请注意,可能存在的任何填充都需要被复制,这使得= 比手动调用memcpy() 可能更快是,因为它永远做不到。

很难在 PDF 中找到一个支持此功能的地方,但我在查找方面不是很有经验。基本上,struct 实例是 C 意义上的“值”,所以大部分讨论只是自动涵盖structs。

喜欢:

(6.2.5,第 1 部分) 存储在对象中或由函数返回的值的含义由 用于访问它的表达式的类型。

(6.2.5,第 20 部分) 结构类型描述顺序分配的非空成员对象集 (并且,在某些情况下,一个不完整的数组),每个都有一个可选的 指定的名称和可能的不同类型。

(6.8.6.4,第 3 部分) 如果执行带有表达式的 return 语句,则表达式的值为 作为函数调用表达式的值返回给调用者。

【讨论】:

以上是关于按值传递和返回结构(带有数组成员)的主要内容,如果未能解决你的问题,请参考以下文章

结构是“按值传递”吗?

为啥不允许将数组按值传递给 C 和 C++ 中的函数?

按值返回和通过 const 引用传递时避免临时构造

使用 JNA 在 Clojure 中按值获取和传递结构

Python按值传递参数和按引用传递参数

如何在 x86 程序集中按值传递结构