定义一个结构体,大小为16个字节
struct AAA { long 1A1; char cA2; char cA3; long 1A4; long 1A5; }*p;
int main() { p = (struct AAA*)0x100000; printf("%p\n", p + 0x1); printf("%p\n", (unsigned char)p + 0x1); printf("%p\n", (unsigned int)p + 0x1); printf("%p\n", (unsigned long*)p + 0x1); printf("%p\n", (unsigned char*)p + 0x1); printf("%p\n", (char *)p + 0x1); printf("%p\n", (char **)p + 0x1); system("pause:"); return 0; }运行结果如下:
这下我们就得分析一下为什么结果会是这样。
1.p(0x100000)是一个指针,指向占16个字节的结构体,加一跳过整个结构体。(p+0x1=0x100010)
2.将p强制类型转化为无符号长整型,是一个数字,加1直接加1。 ((unsigned char)p + 0x1=0x1000001)
3.将p强制类型转化为无符号整型,是一个数字,加1直接加1。 ((unsigned int)p + 0x1=0x1000001)
4.p是一个指针,指向无符号长整型,占4个字节。 (unsigned long*)p + 0x1=0x1000004)
5.p是一个指针,指向无符号字符,占1个字节。 (unsigned char*)p + 0x1=0x1000001)
6.p是一个指针,指向字符,占1个字节。 (char *)p + 0x1=0x1000001)
7.p是一个二级指针,里边存的是地址,占4个字节。 ((char **)p + 0x1=0x1000004)