黑马程序员技术交流社区

标题: 指针原来可以这么玩,别玩砸了!!! [打印本页]

作者: 周易    时间: 2014-8-15 01:21
标题: 指针原来可以这么玩,别玩砸了!!!
例如:int i = 90;
         char v = 3;
        char *p = &v;
printf("v的值为:%d",*p);这样输出的解过为3,但是当 char *p = &v;改为 int *p = &v;输出的结果不是3 ,也不是90,这样指针就会指向其它内存地址,导致出现漏洞。所以指针是要分不同类型的。


作者: 3677065    时间: 2014-8-15 01:49
为什么会这样?
作者: 寇亮    时间: 2014-8-15 09:28
3677065 发表于 2014-8-15 01:49
为什么会这样?

指针只是单纯的指向一个内存地址。例子中char 类型的 v 变量占一个字节并且值为3 , p指向 v 的内存地址。
第一种情况: p 声明为 char * 类型 ,编译器提取 *p 的值时,会从当前 p 指向的位置开始向后读取一个字节的内容,并解析为char 类型。

第二种情况: p 声明为 int * 类型 ,编译器提取 *p 的值时,会从当前 p 指向的位置开始向后读取四个字节的内容,并解析为 int 类型。后三个字节的内容根本不是 char v 定义的,所以可能会出现内存泄露的问题,
作者: cjfire    时间: 2014-8-15 09:49
指针记录内存中的一块地址,而类型,则决定偏移量。
作者: qq541955920    时间: 2014-8-15 10:41
这个老师讲过的。。比如 你说的char *p  char v  int i 分别占用2 1 2个字节(16位)。char *p地址就是ff01 ff02
char v ff03  储存 3 换成2进制就是0000 0011,int 占用2个字节 地址 ff04 储存 01011010 ff05 储存 0000 0000
如果你用int *p = &v  他会按两个字节取数 取地址 ff03和ff04的数据 先去高位 就是 0101 1010 0000 0011  最后得出数字应该是23043
作者: xiniuniu    时间: 2014-8-15 11:23
p指向的是同一内存,只是char*p 只取指向内存中的一个字节,并解释这一字节数据为char。
作者: xiniuniu    时间: 2014-8-15 11:24
本帖最后由 xiniuniu 于 2014-8-15 12:20 编辑

int *p = &v; 还是指向同一内存空间,只是要操作从这个地址开始的四个字节。并把这4个字节解释为int。


作者: 周易    时间: 2014-8-15 14:14
各位大神。。:victory:都解释得很到位
作者: LuckyMe    时间: 2014-8-16 23:31
xiniuniu 发表于 2014-8-15 11:24
int *p = &v; 还是指向同一内存空间,只是要操作从这个地址开始的四个字节。并把这4个字节解释为int。

...

这位兄,敢问你是如何调出这个画面的,真是碉堡了!
作者: Meniny    时间: 2014-8-17 00:16
LuckyMe 发表于 2014-8-16 23:31
这位兄,敢问你是如何调出这个画面的,真是碉堡了!



view Memory就好了,哎不让我上传图片,还得先去别的论坛传图再转过来。。。。.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2