【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"

地址存放如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值