结构体内包含多个成员,这些成员之间在内存中是如何存放的呢?
比如:
<p>struct fraction {</p><p> int num; // 整数部分</p><p> int denom; // 小数部分</p><p>};</p><p>
</p><p>struct fraction fp;</p><p>fp.num = 10;</p><p>fp.denom = 2;</p>
这是一个定点小数结构体,它在内存占 8 个字节(这里不考虑内存对齐),两个成员域是这样存储的:
我们把 10 放在了结构体中基地址偏移为 0 的域,2 放在了偏移为 4 的域。
接下来我们做一个这样的操作:
<p>((fraction*)(&fp.denom))->num = 5; </p><p>((fraction*)(&fp.denom))->denom = 12; </p><p>printf("%d\n", fp.denom); // 输出多少?</p>
上面这个究竟会输出多少呢?自己先思考下噢~
接下来我分析下这个过程发生了什么:
首先,&fp.denom表示取结构体 fp 中 denom 域的首地址,然后以这个地址为起始地址取 8 个字节,并且将它们看做一个 fraction 结构体。
在这个新结构体中,最上面四个字节变成了 denom 域,而 fp 的 denom 域相当于新结构体的 num 域。
|