关于指针的一些注意事项
2010-11-20 23:55
357 查看
#include using namespace std; int * test() { // 创建一个int变量 int a = 1; // 返回该变量的地址 return &a; } int main() { // 声明一个指针 int * p = 0; // 将这个指针指向一个局部变量(函数执行完之后,变量的内存已经被释放掉,而这部分内存已经用于存储其他的值了) p = test(); cout << p << endl; // 用原来的地址来取出一个已经不存在的局部变量的数据(由于原内存已被其他数值占据,所以这里将输出意想不到的数据) cout << *p << endl; // 这时本来是想将原来的a++。但是因为a已不存在,这时对*p指向的进行++操作,其实是修改了其他的数据的值。 // 这样的操作是非常危险的,因为你不知道该内存这个时候存储的是什么,这样的操作有可能导致系统崩溃。 (*p)++; cout << *p << endl; return 0; }
程序最终输出:
0xbfaaecb4
12278008
15294453
而不是我们认为的:
0xbfaaecb4
1
2
为了避免这样的问题,我们应该在test函数中,把a变量放到自由存储区域中,而不是堆栈(局部变量)中:
#include using namespace std; int * test() { // 在自由存储空间中创建一个int变量 int * a = new int(1); // 返回该变量的地址 return a; } int main() { // 声明一个指针 int * p = 0; // 将这个指针指向一个自由存储空间中的变量(由于该变量在自由存储空间中,因此函数执行完之后,该变量并不会被释放掉) p = test(); cout << p << endl; // 该地址指向的数据依然存在 cout << *p << endl; // 可以正常的操作 (*p)++; // 输出正常的结果 cout << *p << endl; // 注意,使用完自由存储区的内存之后,必须要手动释放掉 delete p; // 释放掉内存之后的指针此时还指向原来的内存地址,必须要设置为0(空指针),否则他将成为一个迷途指针,非常危险。 p = 0; return 0; }
程序输出:
0x87dd008
1
2
相关文章推荐
- 关于程序员工作 交接的一些注意事项
- 关于使用存储过程的一些好处以及注意事项
- 关于C/C++内存管理malloc的一些注意事项
- 关于使用存储过程的一些好处以及注意事项[转]
- 关于顺序表插入算法和删除算法的一些注意事项
- 关于myBatis配置中的一些注意事项
- 关于MySql中数据库、表的操作以及增删改查等一些SQL语句注意事项
- 关于 django的一些注意事项
- 指针的一些注意事项
- 关于tomcat的在eclpise下的一些注意事项
- 关于struct ( 结构体 )的一些注意事项:
- 关于linux动态链接库的一些注意事项
- C++中关于&的一些。int i 与 int &i 注意事项
- 关于标准C文件流读写问题:fopen,fread,fwrite,fclose的一些注意事项
- 关于java中bufferedreader的一些注意事项
- 关于JAVA数组的几点注意事项与一些低级错误
- 关于Windows编程中一些注意事项——程序运行时的出错,而调试却没有错
- 关于Android应用开发的一些安全注意事项
- php关于网站安全的一些注意事项
- 关于U盾使用的一些注意事项