实力剖析一个经典笔试题
发布日期:2021-06-30 18:43:36
浏览次数:3
分类:技术文章
本文共 1185 字,大约阅读时间需要 3 分钟。
昨天群里有个同学发了这样一个题目过来,这个题目应该是嵌入式笔试经典题目了,如果是校招的话,笔试不考这个题目,都觉得有点说不过去。
#includeint main(){ int a[5] = {1,2,3,4,5}; int *ptr1 = (int *)(&a +1); int *ptr2 = (int *)(a +1); printf("%x,%x \n",ptr1[-1],*ptr2); return (0);}
这个输出我相信很多人都能看出来是什么了吧,之前我记得在文章里面也有分析过这个题目。
好了,我稍微修改下这个题目,改成下面这样的
#includeint main(){ int a[5] = {1,2,3,4,5}; int *ptr1 = (int *)(&a +1); int *ptr2 = (int *)((int)a +1); printf("%x,%x \n",ptr1[-1],*ptr2); return (0);}
大家好好看题目哈 我把
(int *)(a+1);
改成了
(int *)((int)a +1);
我们知道,a 代表的是数组的首元素的地址,它如果加1 的话,那么应该是
&a[0] + sizeof(int)
这里偏移的应该是一个 a[0] 的长度,因为 a 是代表的 数组元素,这个数组元素是 int
但是
(int *)((int)a +1);
这个加1的话,就不一样了,a 被强制转换成了 int,这个时候加1,就是简单的数学运算增加1。所以这个值应该是
&a[0] +1
我们看看两个截图看到没有,跟我们上面的预测一样
再看看下面的这个,就真的只是增加1而已。
&a[0] + sizeof(int)
所以,我们上面说的这段代码
#includeint main(){ int a[5] = {1,2,3,4,5}; int *ptr1 = (int *)(&a +1); int *ptr2 = (int *)((int)a +1); printf("%x,%x \n",ptr1[-1],*ptr2); return (0);}
最终输出什么呢?这个就涉及我们之前讨论的一个问题,大小端了,先贴出输出结果我写了个小程序来说明为什么是这个结果,我先说下,我们PC默认的是小端模式
b的值就是我们ptr2 指向的数据,他们的内存组合是一样的,因为Dev C++ 对内存显示还不是非常完美,不能直接看到内存,如果用VC来调试就更加清晰了。
看了这个图,我是不是应该什么都不需要说了,可能有人想问我,怎么找到VC6.0的安装包,我就是不告诉你们,等你们来找我。
扫码或长按关注
回复「 篮球的大肚子」进入技术群聊
转载地址:https://linus.blog.csdn.net/article/details/103590807 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月30日 01时09分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Oracle的pfile和spfile的一点理解和笔记
2019-04-30
WebService的简单案例记录(Java)
2019-04-30
Html利用PHP与MySQL交互
2019-04-30
dos简单命令
2019-04-30
mysql的安装与卸载与Navicat远程连接
2019-04-30
java实现稀疏数组及将稀疏数组存入硬盘中
2019-04-30
2021-05-18
2019-04-30
Flutter 使用插件打开相册、相机
2019-04-30
libuv实现tcp代理服务器
2019-04-30
libuv使用不当导致的内存泄漏
2019-04-30
libuv实现ping包发送和接收
2019-04-30
基础架构系列篇-CENTOS7安装NGINX
2019-04-30
基础架构系列篇-系统centos7安装docker+COMPOSE
2019-04-30
基础架构系列篇-系统centos7中docker安装rabbitmq
2019-04-30
基础架构系列篇-NGINX部署VUE
2019-04-30
个人电商项目,基于uni-app+ springcloud +VUE技术
2019-04-30
基础架构系列篇-系统centos7安装kafka
2019-04-30
基础架构系列篇-系统centos7中docker安装分布式文件存储服务minio
2019-04-30
知识点记录-java判断系统是linux或windows
2019-04-30
知识点记录-springboot静态资源映射路径
2019-04-30