C语言笔记第九章指针的安全问题
第九章指针的安全性
看下面的例子:
例17:
char s = ' a ';
int * ptr;
ptr =(int *)& s;
* ptr = 1298;
指针ptr是一个int*指针,它所指向的类型是int。它指向的地址是s的第一个地址
。在32位程序中,s占一个字节,int type占四个字节。最后一条语句不仅
改变了S占用的一个字节,还改变了与S相邻的高位地址方向的三个字节,这三个
字节是干什么用的?只有编译器知道,但编写器不太可能知道。也许
这三个字节存储了非常重要的数据,也许这三个字节恰好是程序的一段代码
,而这三个字节的值由于你不小心应用了指针而被改变了!这将导致崩溃错误
。
我们再来看一个例子:
例18:
1。char a;
2 .int * ptr = & a;
...
...
3 .ptr++;
4 .* ptr = 115
这个例子完全可以编译执行。但是看到了吗?第三句
指针ptr加1后,ptr指向与整形变量a相邻的高地址方向的一个存储区,这个存储区里有什么
?我们不知道。也许它是一个非常重要的数据,甚至是一个代码
。而第四句话居然把一个数据写入了这个存储区!这是一个严重的错误。所以,程序员在使用指针
的时候,脑子里一定要非常清楚:我的指针到底指向哪里?
用指针访问数组时,注意不要超出数组的低端和高端边界,否则
会导致类似的错误。
在指针的强制类型转换中:ptr1=(TYPE*)ptr2,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么使用指针ptr 1访问ptr 2所指向的存储区时是安全的
。如果sizeof(ptr2的类型)小于sizeof(ptr 1的类型),则使用指针ptr1
访问ptr 2指向的存储区域是不安全的。至于为什么,读者结合例17思考一下就应该明白了
。
0条评论