为什么转换和解除引用结构指针会丢失信息?

时间:2015-09-06 11:28:17

标签: c pointers struct casting

我有两种结构类型

typedef struct {
    int i;
    int j;
} struct_a;

typedef struct {
    int i;
} struct_b;

其中struct_astruct_b显然共享一个共同的初始序列。基于这些结构,我有以下片段,我通过转换和解除引用指针在struct_astruct_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);

有效地复制结构?

2 个答案:

答案 0 :(得分:1)

是的,你正在复制。将2*i复制到a时,只有一个值的空间。另一个丢了。

并且不允许在最后一个作业中进行演员表,所以你可以从中获得任何结果。

答案 1 :(得分:1)

转换和解除引用struct指针不会丢失信息。

关于您的代码的一些注意事项:

  • abc是内存中的不同位置。
  • 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);