[牛人杂谈]

指针的安全问题

[复制链接]
308|3
手机看帖
扫描二维码
随时随地手机跟帖
antusheng|  楼主 | 2018-10-28 16:48 | 显示全部楼层 |阅读模式
看下面的例子:
例十八:
char s='a';  
int *ptr;  
ptr=(int *)&s;  
*ptr=1298;
指针ptr 是一个int *类型的指针,它指向的类型是int。它指向的地址就是s 的首地址。在32 位程序中,s 占一个字节,int 类型占四个字节。最后一条语句不但改变了s 所占的一个字节,还把和s 相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。
让我们再来看一例:
例十九:
char a;  
int *ptr=&a;  
ptr++;  
*ptr=115;
该例子完全可以通过编译,并能执行。但是看到没有?第3 句对指针ptr 进行自加1 运算后,ptr 指向了和整形变量a 相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代码。
而第4 句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。
在指针的强制类型转换:ptr1=(TYPE *)ptr2 中,如果sizeof(ptr2的类型)大于sizeof(ptr1 的类型),那么在使用指针ptr1 来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2 的类型) 小于sizeof(ptr1 的类型),那么在使用指针ptr1 来访问ptr2 所指向的存储区时是不安全的。至于为什么,读者结合例十八来想一想,应该会明白的。


antusheng|  楼主 | 2018-10-28 16:48 | 显示全部楼层
指针很高级的,用好了非常棒,用不好容易给自己挖坑。

使用特权

评论回复
21mengnan| | 2018-10-28 21:55 | 显示全部楼层
有一本书专门研究指针的

使用特权

评论回复
734774645| | 2018-10-29 07:54 | 显示全部楼层
有一本书叫C指针

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1447

帖子

5

粉丝