A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周易 中级黑马   /  2014-8-15 01:21  /  1588 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例如:int i = 90;
         char v = 3;
        char *p = &v;
printf("v的值为:%d",*p);这样输出的解过为3,但是当 char *p = &v;改为 int *p = &v;输出的结果不是3 ,也不是90,这样指针就会指向其它内存地址,导致出现漏洞。所以指针是要分不同类型的。

9 个回复

倒序浏览
为什么会这样?
回复 使用道具 举报
3677065 发表于 2014-8-15 01:49
为什么会这样?

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

第二种情况: p 声明为 int * 类型 ,编译器提取 *p 的值时,会从当前 p 指向的位置开始向后读取四个字节的内容,并解析为 int 类型。后三个字节的内容根本不是 char v 定义的,所以可能会出现内存泄露的问题,
回复 使用道具 举报
指针记录内存中的一块地址,而类型,则决定偏移量。
回复 使用道具 举报
这个老师讲过的。。比如 你说的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
回复 使用道具 举报
p指向的是同一内存,只是char*p 只取指向内存中的一个字节,并解释这一字节数据为char。
回复 使用道具 举报
本帖最后由 xiniuniu 于 2014-8-15 12:20 编辑

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

回复 使用道具 举报
周易 中级黑马 2014-8-15 14:14:51
8#
各位大神。。:victory:都解释得很到位
回复 使用道具 举报
xiniuniu 发表于 2014-8-15 11:24
int *p = &v; 还是指向同一内存空间,只是要操作从这个地址开始的四个字节。并把这4个字节解释为int。

...

这位兄,敢问你是如何调出这个画面的,真是碉堡了!
回复 使用道具 举报
LuckyMe 发表于 2014-8-16 23:31
这位兄,敢问你是如何调出这个画面的,真是碉堡了!



view Memory就好了,哎不让我上传图片,还得先去别的论坛传图再转过来。。。。.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马