- 浏览: 70747 次
- 性别:
- 来自: 杭州
最新评论
最近看到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 1427最小c编译器(来源 (最好在linux下操作))代码有好几个 ... -
the development of c language(转)
2011-11-08 09:25 1122c语言之父Dennis Ritchie 写的关于c语言开发历 ... -
C语言,你真的弄懂了么?
2011-11-07 12:42 1731程序(来源 ): #include <stdi ... -
pe文件格式实例解析
2011-11-07 10:05 0环境:windows xp 速龙3000+(即x86兼容32位 ... -
小型elf "Hello,World"程序
2011-11-06 23:59 1330参考链接:http://timelessname.com/el ... -
elf文件格式实例解析
2011-11-05 23:00 6287试验环境:archlinux 速龙3000+(即x86兼 ... -
高质量的c源代码
2011-11-03 10:18 1101现在自由软件及开源软件越来越流行,有大量的附带源程序 ... -
fltk 库
2011-09-26 19:47 1774fltk是一个小型、开源、支持OpenGL 、跨平台(win ... -
《Introduction to Computing Systems: From bits and gates to C and beyond》
2011-09-25 23:33 2125很好的一本计算机的入门书,被很多学校采纳作为教材,作者Yale ... -
csapp bufbomb实验
2011-09-16 14:21 4555csapp (《深入理解计算机系统》)一书中有一个关于缓冲区 ... -
the blocks problem(uva 101 or poj 1208)
2011-09-11 20:57 1806题目描述见: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 993代码比较粗糙,主要是用于对排序算法的理解,因而忽略了边界和容错 ... -
编译器开发相关资源
2011-08-31 08:40 1173开发编译器相关的一些网络资源: how difficu ... -
zoj 1025 Wooden Sticks
2011-07-23 20:25 948题目见:zoj 1025 先对木棒按照长度进行排序,然后再计 ... -
zoj 1088 System Overload
2011-07-23 17:30 1139约瑟夫环 (josephus problem )问题, ... -
zoj 1091 Knight Moves
2011-07-23 09:05 820题目见zoj 1091 使用宽度搜索优先来求解, ... -
zoj 1078 palindrom numbers
2011-07-22 19:31 1122题目见zoj 1078 主要是判断一个整数在基数为2 ... -
zoj 1006 do the untwist
2011-07-22 13:24 904题目见zoj 1006 或poj 1317 简单 ... -
zoj 3488 conic section
2011-07-22 12:23 973题目见zoj 3488 很简单的题目,却没能一次搞定,因 ...
相关推荐
计算机中C语言的应用特点管窥.pdf
基于审计的可审性管窥会计信息系统的设计
管窥电影
流动性估值跟踪:管窥2021年股权激励.pdf
从人脸识别管窥全球智慧城市的隐私文化差异.pdf
流动性估值跟踪:管窥2021年股权激励(43页).pdf
从台湾教育中管窥“适性教育”之曙光.doc
中考语文管窥及应对.ppt
管窥国内的物流业.doc
管窥烟草行业信息化.docx
于右任书法对联特点管窥.zip
电力线通信技术管窥.pdf
出版业供给侧改革管窥.docx
管窥G供电公司绩效管理.docx
大学语文教学中学生心理管窥.docx
浅论赵孟頫书画艺术管窥.docx
“管窥GPU”九则.pdf
新能源汽车节能机制管窥.pdf
新媒体时代的新闻传播途径管窥
管窥煤矿经济管理的跨越式发展