我有两种结构类型
typedef struct {
int i;
int j;
} struct_a;
typedef struct {
int i;
} struct_b;
其中struct_a
和struct_b
显然共享一个共同的初始序列。基于这些结构,我有以下片段,我通过转换和解除引用指针在struct_a
和struct_b
之间进行转换
struct_a a = { 0, 1 };
printf("%i %i\n", a.i, a.j);
struct_b b = *((struct_b *)&a);
printf("%i\n", b.i);
struct_a c = *((struct_a *)&b);
printf("%i %i\n", c.i, c.j);
用gcc编译后上面代码的输出是
0 1
0
0 0 <= ?
我的问题是为什么c
会丢失初始化j
时指定的a
的值?是因为解除引用指针,例如,在
struct_b b = *((struct_b *)&a);
有效地复制结构?
答案 0 :(得分:1)
是的,你正在复制。将2*i
复制到a
时,只有一个值的空间。另一个丢了。
并且不允许在最后一个作业中进行演员表,所以你可以从中获得任何结果。
答案 1 :(得分:1)
关于您的代码的一些注意事项:
a
,b
和c
是内存中的不同位置。c.j
尚未在代码中初始化,其值可能是任何内容。为相同变量来回转换类型会产生预期结果:
struct_a c = *((struct_a *)((struct_b *)&a));
printf("%i %i\n", c.i, c.j);
产生预期结果的另一个选项:
struct_a a = { 0, 1 };
printf("%i %i\n", a.i, a.j);
struct_b *b = (struct_b *)&a; // *b points a
printf("%i\n", b->i);
struct_a c = *((struct_a *)b); // c is a copy of a
printf("%i %i\n", c.i, c.j);