如何避免野指针?
2016-07-19 14:40
232 查看
野指针是指随机访问了内存空间,归根到底是由于不良的编码习惯,有个良好的编程习惯是避免“野指针”的唯一方法。
如何避免野指针:
1)初始化:char*p = NULL;(为何赋值为NULL:一是NULL是一个宏,高亮,检查段错误的时候比较显眼。二是NULL为值,不能对NULL值赋值或者访问。)
2)对指针赋值时,先检查是否分配内存,如果没有分配空间,用malloc分配内存。
如:Char *ptr
Ptr = (char *)malloc(sizeof(char)*100);
3)malloc的返回值为void *,因为为char型指针,所以malloc要强制转换为char
*型。虽然已经使用了malloc,但是也有没有分配成功的情况,要通过if(NULL
== ptr)来判断是否分配成功。
分配好内存之后,但是也不排除会分配一个刚配释放的内存,所以需要清空缓冲区,通过memset函数或者bzero函数来清空。
Memset:
Memset(ptr,0,sizeof(ptr)),这个用法是错的,ptr是指针,sizeof(ptr)为4个字节,而我们ptr该中往往不止4个字节。
所以应该为(ptr , 0 , sizeof(ptr) * 100);这个是指ptr所指向的内存区中前N个字节用0字节填空。
Bzero:
Bzero(ptr,sizeof(char) * 100);这是说从ptr开始的100个字节全部置为0。
Memset与bzero的不同之处在于:memset可以用各种不同的值来填充,而bzero只能用0来填充。
4)清空完缓存之后就可以对这个指针赋值了
5)用完之后用free(ptr)来释放内存,同时还要对ptr赋NULL,即ptr
= NULL;
如何避免野指针:
1)初始化:char*p = NULL;(为何赋值为NULL:一是NULL是一个宏,高亮,检查段错误的时候比较显眼。二是NULL为值,不能对NULL值赋值或者访问。)
2)对指针赋值时,先检查是否分配内存,如果没有分配空间,用malloc分配内存。
如:Char *ptr
Ptr = (char *)malloc(sizeof(char)*100);
3)malloc的返回值为void *,因为为char型指针,所以malloc要强制转换为char
*型。虽然已经使用了malloc,但是也有没有分配成功的情况,要通过if(NULL
== ptr)来判断是否分配成功。
分配好内存之后,但是也不排除会分配一个刚配释放的内存,所以需要清空缓冲区,通过memset函数或者bzero函数来清空。
Memset:
Memset(ptr,0,sizeof(ptr)),这个用法是错的,ptr是指针,sizeof(ptr)为4个字节,而我们ptr该中往往不止4个字节。
所以应该为(ptr , 0 , sizeof(ptr) * 100);这个是指ptr所指向的内存区中前N个字节用0字节填空。
Bzero:
Bzero(ptr,sizeof(char) * 100);这是说从ptr开始的100个字节全部置为0。
Memset与bzero的不同之处在于:memset可以用各种不同的值来填充,而bzero只能用0来填充。
4)清空完缓存之后就可以对这个指针赋值了
5)用完之后用free(ptr)来释放内存,同时还要对ptr赋NULL,即ptr
= NULL;
相关文章推荐
- 调试程序debug的使用
- poj 1201 序列加强版
- 推荐几款实用的Android Studio 插件
- mkdir 命令
- CodeForces 447C DZY Loves Sequences (dp 子序列)
- 使用Quartz2D绘制简单线段
- 使用Quartz2D绘制简单线段
- Centos 7.2配置网卡 远程连接
- 最短路
- **MYSQL** 数据库操作DDL
- Oracle Spatial 12C GeoRaster导入影像栅格数据并显示
- poj 数学
- Java基础知识二
- Android开发将List转化为JsonArray和JsonObject
- js禁止回车键提交表单
- Android开发技术周报 Issue#34
- 在xcode运行编译时,编译成功,但项目中显示缺少该文件,这是只要关闭重启xcode即可。
- 前端开发必备站点汇总
- Java中equals和==的区别
- 统计学习方法笔记(四)