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;
}
4

1 回答 1

5

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

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

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

像:

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

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

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

于 2012-11-14T16:46:33.430 回答