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 内でこれをサポートする場所を 1 つ見つけるのは非常に困難ですが、私は見る経験があまりありません。基本的に、structインスタンスは C の意味での「値」であるため、ほとんどの話は自動的にstructs をカバーします。

お気に入り:

(6.2.5、パート 1) オブジェクトに格納された値または関数によって返された値の意味は、それにアクセスするために使用される式の型によって決まります。

(6.2.5、パート 20) 構造体型は、順次割り当てられたメンバー オブジェクト (および、特定の状況では不完全な配列) の空でないセットを記述します。各オブジェクトには、オプションで指定された名前と、場合によっては異なる型があります。

(6.8.6.4、その 3) 式を含む return ステートメントが実行されると、式の値が関数呼び出し式の値として呼び出し元に返されます。

于 2012-11-14T16:46:33.430 に答える