比较有趣的题3

typedef struct student
{
	char s_id[10];
	char s_name[10];
	char sex;
	int age;
	char addr[20];
	double score;
	int num;
}typedef;

     这道题要问你都是这个score这个成员在这个结构体的第几个字节,其实也就是问这个score之前这个机构体有多少个字节。

     这个题一看是可以看出来的,s_id十个字节,s_name十个字节,sex一个字节但是要和int类型的age对齐就成了四个字节,这个age不用说就是四个字节,addr二十个字节,这加一块10+10+4+4+20=48个字节,但现在要用个程序写出来,我第一时间还是有点懵的,但确实没有限制的话是可以写出来的,比如下面的。

student s;
int i = (int)(&s.score) - (int)&s;
printf("%d\n", i);

     这里算出来的i就是前面的字节个数,我是用地址去考虑的,先创造出来这个结构体的一个对象,取地址,再把它强转成一个整数,这就有一个数字出来了,然后用这个成员标记到score这个成员里面,取地址,再强转成一个整形,因为对对象取地址是指向这个对象的头的,所以用成员的取地址转成的整数减去头这个地址就是score前面的字节个数了,这算下来就是48。

      但是这里有了一个限制,不允许用对象,怎么来做?

int i = (int)((int)&((student*)0)->score);
printf("%d\n", i);

       这个代码看的时候又懵了,这是个啥呀,来咱们一步一步分析一下这个代码,先是将0强转成student类型的指针,这一步的意义就在于这个指针的地址就是0,然后将它指向对象score然后再取地址,那这个时候猜一下,这个时候取得的地址1是什么,没有错就是将指针向后移动了48个字节,然后将他转成整形输出,答案48且没有用到对象,这个代码真的是可以的,直接将指针的地址变为0,然后顺便指向题上的成员,这个典型的无中生有,甚是精妙的呀,对于地址的运用,是目前我这个菜鸟的不能再菜鸟的程序员的一大弱点,但这个题给了我启发,地址不单单是用来操作一片空间,地址还能够用来计算距离大小,启发很大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值