- 浏览: 73003 次
- 性别:
- 来自: 杭州
最新评论
最近看到mit的操作系统课程网站,其实验一
中练习四(exercise 4)中有一个关于指针使用的代码:
其中比较有趣的是 c = (int *) ((char *) c + 1);*c = 500 这两行程序的执行结果。
在执行这两行代码前,数组a中四个元素的值分别为200,400,301,302,而在intel处理器的32位操作系统上执行完这两行代码后的值则为200,128144,256,302,即这两行代码修改了a[1]和a[2]的值。这是什么原因呢?
200,400,301,302这四个值用十六进制形式表示即为0x000000c8,0x00000190,0x0000012d,0x00000012e。由于intel处理器是little-endian的,即数据的较高位存储在较低内存的位置。所以数组a中数值在内存中二进制表示形式(用十六进制书写)则为 c8 00 00 00 90 01 00 00 2d 01 00 00 2e 01 00 00。在执行上面指针c的两行代码之前,指针c恰好指向90所在的位置。而c = (int*)((char *) c+1);则将本来为指向四个字节数据的指针强制转换成指向一个字节数据的指针,这就导致此后的c+1的执行结果是指向0x01这个内容,之后又将c强制转换成int类型并将其指向的内容赋值为500(0x000001F4)这样原来的01 00 00 2d就被F4 01 00 00所覆盖。所以数组a中数值就变为c8 00 00 00 90 f4 01 00 00 01 00 00 2e 01 00 00。即a中四个元素的值分别为200(0x000000c8),128144(0x0001f490),256(0x00000100),302(0x0000012e).
关于指针的更多讲解见英文教程: http://pweb.netcom.com/~tjensen/ptr/
中练习四(exercise 4)中有一个关于指针使用的代码:
#include <stdio.h> #include <stdlib.h> void f(void) { int a[4]; int *b = malloc(16); int *c; int i; printf("1: a = %p, b = %p, c = %p\n", a, b, c); c = a; for (i = 0; i < 4; i++) a[i] = 100 + i; c[0] = 200; printf("2: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n", a[0], a[1], a[2], a[3]); c[1] = 300; *(c + 2) = 301; 3[c] = 302; printf("3: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n", a[0], a[1], a[2], a[3]); c = c + 1; *c = 400; printf("4: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n", a[0], a[1], a[2], a[3]); c = (int *) ((char *) c + 1); *c = 500; printf("5: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n", a[0], a[1], a[2], a[3]); b = (int *) a + 1; c = (int *) ((char *) a + 1); printf("6: a = %p, b = %p, c = %p\n", a, b, c); } int main(int ac, char **av) { f(); return 0; }
其中比较有趣的是 c = (int *) ((char *) c + 1);*c = 500 这两行程序的执行结果。
在执行这两行代码前,数组a中四个元素的值分别为200,400,301,302,而在intel处理器的32位操作系统上执行完这两行代码后的值则为200,128144,256,302,即这两行代码修改了a[1]和a[2]的值。这是什么原因呢?
200,400,301,302这四个值用十六进制形式表示即为0x000000c8,0x00000190,0x0000012d,0x00000012e。由于intel处理器是little-endian的,即数据的较高位存储在较低内存的位置。所以数组a中数值在内存中二进制表示形式(用十六进制书写)则为 c8 00 00 00 90 01 00 00 2d 01 00 00 2e 01 00 00。在执行上面指针c的两行代码之前,指针c恰好指向90所在的位置。而c = (int*)((char *) c+1);则将本来为指向四个字节数据的指针强制转换成指向一个字节数据的指针,这就导致此后的c+1的执行结果是指向0x01这个内容,之后又将c强制转换成int类型并将其指向的内容赋值为500(0x000001F4)这样原来的01 00 00 2d就被F4 01 00 00所覆盖。所以数组a中数值就变为c8 00 00 00 90 f4 01 00 00 01 00 00 2e 01 00 00。即a中四个元素的值分别为200(0x000000c8),128144(0x0001f490),256(0x00000100),302(0x0000012e).
关于指针的更多讲解见英文教程: http://pweb.netcom.com/~tjensen/ptr/
发表评论
-
最小c编译器
2011-11-08 14:09 1491最小c编译器(来源 (最好在linux下操作))代码有好几个 ... -
the development of c language(转)
2011-11-08 09:25 1318c语言之父Dennis Ritchie 写的关于c语言开发历 ... -
C语言,你真的弄懂了么?
2011-11-07 12:42 1774程序(来源 ): #include <stdi ... -
pe文件格式实例解析
2011-11-07 10:05 0环境:windows xp 速龙3000+(即x86兼容32位 ... -
小型elf "Hello,World"程序
2011-11-06 23:59 1379参考链接:http://timelessname.com/el ... -
elf文件格式实例解析
2011-11-05 23:00 6364试验环境:archlinux 速龙3000+(即x86兼 ... -
高质量的c源代码
2011-11-03 10:18 1169现在自由软件及开源软件越来越流行,有大量的附带源程序 ... -
fltk 库
2011-09-26 19:47 1847fltk是一个小型、开源、支持OpenGL 、跨平台(win ... -
《Introduction to Computing Systems: From bits and gates to C and beyond》
2011-09-25 23:33 2189很好的一本计算机的入门书,被很多学校采纳作为教材,作者Yale ... -
csapp bufbomb实验
2011-09-16 14:21 4632csapp (《深入理解计算机系统》)一书中有一个关于缓冲区 ... -
the blocks problem(uva 101 or poj 1208)
2011-09-11 20:57 1841题目描述见:uva 101 or poj 1208 ... -
the blocks problem(uva 101 or poj 1208)
2011-09-11 20:56 0题目描述见:uva 101 or poj 1208 ... -
部分排序算法c语言实现
2011-09-02 14:51 1024代码比较粗糙,主要是用于对排序算法的理解,因而忽略了边界和容错 ... -
编译器开发相关资源
2011-08-31 08:40 1215开发编译器相关的一些网络资源: how difficu ... -
zoj 1025 Wooden Sticks
2011-07-23 20:25 972题目见:zoj 1025 先对木棒按照长度进行排序,然后再计 ... -
zoj 1088 System Overload
2011-07-23 17:30 1177约瑟夫环 (josephus problem )问题, ... -
zoj 1091 Knight Moves
2011-07-23 09:05 853题目见zoj 1091 使用宽度搜索优先来求解, ... -
zoj 1078 palindrom numbers
2011-07-22 19:31 1152题目见zoj 1078 主要是判断一个整数在基数为2 ... -
zoj 1006 do the untwist
2011-07-22 13:24 944题目见zoj 1006 或poj 1317 简单 ... -
zoj 3488 conic section
2011-07-22 12:23 1015题目见zoj 3488 很简单的题目,却没能一次搞定,因 ...
相关推荐
首先,C语言的操作过程简单、灵活性强,支持通过关键字和控制语言进行编程。它包含32个关键字,9种控制语句,允许编程者自由发挥编程空间,同时支持大小写敏感,能够实现高级语言和低级语言的混合使用。此外,C语言...
维特根斯坦的怀疑论-伦确定性管窥.ppt
基于审计的可审性管窥会计信息系统的设计
管窥电影
流动性估值跟踪:管窥2021年股权激励.pdf
从人脸识别管窥全球智慧城市的隐私文化差异.pdf
基础性原则强调了课程设置的稳定性和核心课程的重要性,真实性原则则要求课程设置要贴近生产实际和企业需求,模块化教学原则则强调课程设置的灵活性和多样性。 在中职电子技术应用专业课程设置中,需要考虑学生的跨...
从台湾教育中管窥“适性教育”之曙光.doc
新媒体时代的新闻传播途径管窥
报告标题:“流动性估值跟踪:管窥2021年股权激励”主要探讨了2021年中国股权激励的情况,以及宏观经济流动性和A股市场的变化。报告由浙商策略团队完成,涉及的内容包括宏观流动性、A股市场资金面与情绪面、A股与...
管窥非公有制林业经济发展.doc
试谈法国金融市场监管管窥.doc
试谈法国金融市场监管管窥.docx
管窥网页设计中的色彩理论.pdf
大数据时代个人信息的民法保护管窥.docx
WEB2.0环境下网络安全技术管窥.pdf
《中考语文管窥及应对》的讲解主要涵盖了中考语文备考的关键要点,旨在帮助教师和学生更好地理解和应对这一重要考试。以下是对这些要点的详细解析: 首先,要认清一种关系,即依据大纲,兼顾课标。大纲是教学的基本...
管窥移动互联网应用中的新型经济犯罪.docx
保险企业信息安全思路之管窥与思考.pdf