Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按值传递和返回结构(包含数组成员)_C_Arrays_Return_Structure_Pass By Value - Fatal编程技术网

C 按值传递和返回结构(包含数组成员)

C 按值传递和返回结构(包含数组成员),c,arrays,return,structure,pass-by-value,C,Arrays,Return,Structure,Pass By Value,我知道在C语言中,可以通过值传递(或返回)结构,但不能通过值传递数组。当结构包含数组时会发生什么?当通过值传递(或返回)结构时,是否会复制(位于结构中的)数组?我已经运行过了,它可以正常工作,但我想知道在标准中这是在哪里涵盖的(是的,我已经看过了) typedef结构 { 浮动汇率; 国际原子能机构[5]; }我的结构; myStruct addValueToArray(myStruct in) { myStruct out=in; int i; 对于(i=0;i

我知道在C语言中,可以通过值传递(或返回)结构,但不能通过值传递数组。当结构包含数组时会发生什么?当通过值传递(或返回)结构时,是否会复制(位于结构中的)数组?我已经运行过了,它可以正常工作,但我想知道在标准中这是在哪里涵盖的(是的,我已经看过了)

typedef结构
{
浮动汇率;
国际原子能机构[5];
}我的结构;
myStruct addValueToArray(myStruct in)
{
myStruct out=in;
int i;
对于(i=0;i<5;i++)
{
out.anArray[i]=in.anArray[i]+in.aValue;
}
返回;
}

是的,它将被复制。整个结构都是一个值,因此可以将其传递给函数、返回和赋值(许多人似乎忘记了这一点,但您使用它,很好!)

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

在PDF中很难找到一个支持这一点的地方,但我在查找方面不是很有经验。基本上,
struct
实例是C意义上的“值”,因此大部分讨论都自动涉及到
struct
s

比如:

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

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

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


结构中包装数组是按值传递数组的常用方法。
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;
}