下面代码在i386系列PC中输出是什么:
typedef struct st{
int xxx;
short* yyy;
char ccc[32];
}pst;
int main(void){
pst ppp[16];
char* p = (char*)(ppp[2].ccc+32);
printf("%d\n",(p-(char*)(ppp)));
}
分析:求的是什么? p是一个地址,ppp也是一个地址,两者相减,明显求的是偏移量。
现在先来看看sizeof(pst)的值,在i386系列PC下,int、指针都是4字节,所以sizeof(pst)=40,那p所指的位置在哪里呢?
(char*)(ppp)=sizeof(pst)*2+sizeof(int)+sizeof(short*)+32 + p
偏移量 + 基址
由上面分析可得,答案是(4+4+32)*2+4+4+32=120
扩散一下:如果是在64位系统下呢? 只要考虑64位下int是4字节(要考虑对齐),指针是8字节,char还是1字节就可以得到答案是(8+8+32)*2+8+8+32 =48*3 =144