【LittleXi】地址空间三题

【LittleXi】地址空间三题

问题

给定这个结构体

struct
{
    
    
    bool s;
    short b;
    const char *str = "AABB";
    int i;
} a[2];

计算这三个输出

printf("%d\n", (char *)(&(a[0].i)) - (char *)(&(a[0].s)));
printf("%x\n", (&(a[1].i)) - (&(a[0].i)));
printf("%x\n", *(short *)(a[0].str + 2) - *(short *)(a[0].str));

分析及答案

第一问:答案是16,由存储结构可知,计算的是a[0]中i的位置减去s的位置
第二问:答案是0x6,计算的是两个数组同一位置的差值,其实就是一个结构体的大小,由存储结构可知为8+8+4+4=24=0x18,但是根据指针减法特性,应该除以int的大小也就是0x18/4,答案为0x6
第三问:答案是0x101,这题比较神奇,先获取str首位置便宜02的位置,然后把他转为short*类型,然后再解地址,
因为被强转为了short,所以会解2个byte的值出来,*(short *)(a[0].str + 2)解值出来是"BB"对应16进制的0x4242*(short *)(a[0].str)解值出来是"AA"对应16进制是0x4141,
第三问其实已经降低难度了,如果str是"ABCD",那么根据小端法原则,解值出来是"DC""BA"

地址存放如下:

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_68591679/article/details/133995770