首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟在这请问几个小问题啊等,多谢

2012-02-04 
小弟在这请教几个问题啊,急等,谢谢啊structtagABC{charcBshortsCcharcDlonglA}*pAbcpAbc0x100000pAb

小弟在这请教几个问题啊,急等,谢谢啊
struct   tagABC
{
            char   cB;
            short   sC;
            char   cD;
            long   lA;
}*pAbc;
pAbc=0x100000
pAbc+0x100=0x__   ?       (ULONG)pAbc+0x100=0x__   ?       (ULONG*)pAbc+0x100=0x__   ?
(char*)pAbc+0x100=0x___?

[解决办法]
自己上机看看不就知道了?这么好实现,要自己做啊。
[解决办法]
是内存对齐问题吧:
第一个char占一个字节,但由于下一个short占两个字节,需要按2字节对齐,所以其实第一个char后面会填充一个空字节。
所以:
char cB;
short sC;一共占四个字节

同样,接下来的是一个char占一个字节,但是后面Long是按4字节对齐,需要填充3个空字节在char后面。
char cD;
long lA;//一共占8个字节

所以sizeof(tagABC)=12;

pAbc+0x100= 0x100000 + 0x100*sizeof(tagABC) //sizeof(tagABC)=12
(ULONG)pAbc+0x100= 0x100000 + 0x100*sizeof(ULONG) //sizeof(ULONG)=4(视机器而定)
(ULONG*)pAbc+0x100= 0x100000 + 0x100*sizeof(ULONG*) //sizeof(ULONG*)=4
(char*)pAbc+0x100= 0x100000 + 0x100*sizeof(char*) //sizeof(char*)=4
[解决办法]
怎么算结果都一样。
如果按十六进制乘所有数就都转成16进制后再相乘:
0x100*sizeof(tagABC) = 0x100*0xC = 0xC00;
0x100000+0xC00 = 0x100C00;

如果转成10进制相乘:
0x100*sizeof(tagABC)=256*12 =3072;
0x100000+3072 = 1048576+3072=1051648;

热点排行