第九章 指针的安全问题
2011-06-12 22:46
134 查看
看下面的例子:
例十七:
char s='a';
int *ptr;
ptr=(int*)&s;
*ptr=1298;
指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的
首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但
改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三
个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许
这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码
,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错
误。
让我们再来看一例:
例十八:
1。 char a;
2。 int *ptr=&a;
...
...
3。 ptr++;
4。 *ptr=115;
该例子完全可以通过编译,并能执行。但是看到没有?第3句对指针ptr进行
自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储
区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代
码。而第4句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指
针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。
在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则
也会造成类似的错误。
在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大
于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安
全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1
来访问ptr2所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一
想,应该会明白的。
例十七:
char s='a';
int *ptr;
ptr=(int*)&s;
*ptr=1298;
指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的
首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但
改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三
个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许
这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码
,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错
误。
让我们再来看一例:
例十八:
1。 char a;
2。 int *ptr=&a;
...
...
3。 ptr++;
4。 *ptr=115;
该例子完全可以通过编译,并能执行。但是看到没有?第3句对指针ptr进行
自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储
区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代
码。而第4句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指
针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。
在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则
也会造成类似的错误。
在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大
于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安
全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1
来访问ptr2所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一
想,应该会明白的。
相关文章推荐
- 第九章。指针的安全问题
- 嵌入式 Linux C语言(九)——C语言的安全问题和指针陷阱
- 深入理解C指针之五(指针的安全问题)--By kmalloc
- 嵌入式 Linux C语言(九)——C语言的安全问题和指针陷阱
- (9)让你不再害怕指针--指针的安全问题
- C/C++字符串,字符数组,字符指针及其相互静态拷贝与追加的安全问题解决方案(1)
- 安全指针使用的例子 (也有问题)
- C语言指针安全及指针使用问题
- 深入理解 C++ 指针(九)---指针的安全问题
- C语言指针安全及指针使用问题
- 主流的媒体播放软件对URL在线播放大部分存在指针越位的安全问题
- 不要伤害指针(6)--指针的安全问题
- C和指针--第九章_问题
- C/C++字符串,字符数组,字符指针及其相互静态拷贝与追加的安全问题解决方案(2)
- 指针的强制类型转换时的安全使用问题
- C安全问题与指针误用
- C指针的若干复杂问题
- servlet和action的线程安全问题
- SimpleDateFormat 的线程安全问题与解决方案
- java 调c写的dll 指针参数返回问题 char* PointerByReference创建 Pointer