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

alt*_*dky 3 c arrays structure return pass-by-value

我知道在C中你可以按值传递(或返回)一个结构但你不能按值传递一个数组.当结构包含数组时会发生什么?结构是按值传递(或返回)时是否会复制数组(在结构中)?我在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;
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 5

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

请注意,这可能是目前需要任何填充被复制,这使得它可能=更快比手动调用memcpy()可能是,因为它不可能做到这一点.

很难在PDF中找到支持这一点的单个地方,但我在寻找方面不是很有经验.基本上,struct实例是C语言中的"值",因此大多数谈话都会自动覆盖structs.

喜欢:

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

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

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