分类: C/C++
2015-10-08 18:05:52
点击(此处)折叠或打开
2.
struct tagABC
{
char cB;
short sC;
char cD;
long lA;
}*pAbc;
pAbc=0x100000;
那么pAbc+0x100=0x100C00;(ULONG)pAbc+0x100=0x100400; (ULONG*)pAbc+0x100=0x100400;(char *)pAbc+0x100=0x100400;
解析:
系统是32位的,且char占一个字节(byte),unsigned long 占4个字节
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;
3.
union
{
int k;
char i[2];
}*s,a;
s=&a;
s->i[0]=0x39;
s->i[1]=0x39;
printf("%x\n", a.k);
如果int是4字节的话打印出来应该是0xcccc3839.看样子应该是VC平台。
共用体里里面定义的成员共用相同的存储空间,空间大小按照成员中最大的空间分配。
共用体里里面定义的成员共用相同的存储空间,空间大小按照成员中最大的空间分配。
所以k和i[2]共用一块4字节内存,Win32小端模式下低字节在前,所以在内存顺序是:k0 k1 k2 k3,但这4个字节又与i[2]共用,即k0与i[0]共用,k1与i[1]共用,所以i[0]=0x39,i[1]=0x38后同时给k0,k1赋值了。
由于VC调试态下默认将内存空间初始化为0xcc/0xcd,所以会k2=0xcc,k3=0xcc 打印出来k就是k3 k2 k1 k0 就是0xcccc3839了
若int占2位则结果是14393;(0x3839)