一般的に、あなたは確実に、memcpy
を使用してそれを行うことはできません。したがって、部分コピーを実行する最も安全な方法は、3つのフィールドを個別に割り当てることです。ので、ゼロであることが保証されて
struct source s {1,2,3,4,5,6};
struct destination d = {100, 200, 300};
memcpy(&d, ((char*)(&s))+offsetof(struct source,d), offsetof(struct source,f)-offsetof(struct source,d)+sizeof(int));
がdestination
のd
のオフセット:コンパイラは、あなたの特定のケースで異なる整列要件を持つメンバー間にパディングを挿入しますので、
ただし、このようなmemcpy
を使用することができますそれは構造の最初のメンバーです。 d
、e
、およびf
は同じアライメント要件を持っているので、パディングがある場合は、struct destination
ではそれを後にし、struct source
ではそれらの前後になります。
オフセットはバイト単位で表されるため、char*
にキャストする必要があります。
表現
offsetof(struct source,f)-offsetof(struct source,d)+sizeof(int)
はd
とf
、までの間のランの長さです。 sizeof(struct destination)
を使用することは、struct source
に存在しない末尾にパディングがあり、割り当てられたメモリを超えて読み込みが発生する可能性があるため、安全ではありません。
は、あなたがこれまでにやっている私たちを表示します。さもなければ、人々はあなたが彼らにあなたの宿題をさせようとしていると思われるでしょう。 – janneb
なぜmemcpyを使いたいのですか?これはstruct packingについての宿題ですか? –
これは宿題の場合、宿題タグを追加しますか?ありがとう。 – octopusgrabbus