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

3
我知道在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;
}

3
用结构体包装数组是传递数组的常用方式。 - Kerrek SB
1个回答

4

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

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

很难在PDF中找到一个单独支持这个的地方,但我不太擅长查找。基本上,struct实例在C的意义上是“值”,所以大部分的讨论都自动涵盖了struct

像这样:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接