部分的なコピーでは、一致するフィールドをコピーで設定しますが、一致しないフィールドは設定しないままにします(つまり、以前の値を保持する)。構造体のインスタンスを、ある文の別の型の別の型に部分的にコピーできますか?
それは起こっていないようです。私はなぜ不思議です、そして、これが未定義の振る舞いであれば?
#include <stdio.h>
#define print_base(s) printf("%d %d\n", s.a, s.b)
#define print_extended(s) printf("%d %d %d\n", s.a, s.b, s.c)
typedef struct
{
int a;
int b;
} base;
typedef struct
{
int a;
int b;
int c;
} extended;
int main()
{
base s1 = {1,2};
extended s2 = {0};
extended s3 = {0};
extended s4 = {4,5,6};
extended s5 = {4,5,6};
extended s6 = {7,8,9};
base s7 = {0};
print_extended(s2);
s2 = *(extended*)&s1;
print_extended(s2);
print_extended(s3);
memcpy(&s3, &s1, sizeof(s3));
print_extended(s3);
print_extended(s4);
s4 = *(extended*)&s1;
print_extended(s4);
print_extended(s5);
memcpy(&s5, &s1, sizeof(s5));
print_extended(s5);
/* lossy copy */
print_base(s7);
s7 = *(base*)&s6;
print_base(s7);
return 0;
}
/*
Actual Expected
0 0 0 0 0 0
1 2 1 1 2 0
0 0 0 0 0 0
1 2 1 1 2 0
4 5 6 4 5 6
1 2 1 1 2 6
4 5 6 4 5 6
1 2 1 1 2 6
0 0 0 0
7 8 7 8
*/
'sizeof(s1)'が 'sizeof(s3)'より小さいので、 'memcpy(&s3、&s1、sizeof(s3));'のオブジェクトの境界を越えてアクセスするための未定義の動作です。 – EOF
これは 'struct'の日か何ですか? –