如何避免野指针(详解)
2016-07-18 20:04
190 查看
野指针:随机指向内存中的一个地址,对于这个地址不一定有访问权,会导致内存泄漏(访问了已经释放的内存,或没有访问权限)。
下面这个程序很好的避免了野指针:
#include <stdio.h>
#include <stdlib.h>
//#define NULL (void *)0 //(void *0) 是0地址,是不允许操作,不允许访问的。
#define MAX_SIZE sizeof(char) * 100
//memset bzero
int main()
{
char *ptr = (char *)malloc(MAX_SIZE);//必须是相同类指针类型赋值,否则有可能会越界。
if(NULL == ptr)
{
printf("malloc error!\n");
exit(1);
}
//memset(ptr,0,MAX_SIZE);
bzero(ptr,MAX_SIZE);
scanf("%s",ptr);
printf("ptr = %s\n",ptr);
free(ptr);
ptr = NULL;
}
如何避免野指针:
(1)当指针没有做初始化,即没有指向时,将指针指为NULL。一方面可以提醒自己这个指向NULL的指针不可操作不可访问,另一方面NULL这个标记便于我们检查和避免野指针;
初始化为NULL的目的:一是出现段错误时易改错,二是(void *0) 是0地址,是不允许操作,不允许访问的。
(2)当想给指针赋值时,检查是否已经给他分配了内存空间,如果没有分配就再用malloc分配;
(3)给指针分配完内存后,不使用时再用free()函数清空内存空间(清空原来的缓冲区),并再将指针指为NULL。
注:void * 为万能指针,可以接收任何类型的指针,但是不能对其取值(不能对他指向的空间进行操作,他只能暂时存放地址)
下面这个程序很好的避免了野指针:
#include <stdio.h>
#include <stdlib.h>
//#define NULL (void *)0 //(void *0) 是0地址,是不允许操作,不允许访问的。
#define MAX_SIZE sizeof(char) * 100
//memset bzero
int main()
{
char *ptr = (char *)malloc(MAX_SIZE);//必须是相同类指针类型赋值,否则有可能会越界。
if(NULL == ptr)
{
printf("malloc error!\n");
exit(1);
}
//memset(ptr,0,MAX_SIZE);
bzero(ptr,MAX_SIZE);
scanf("%s",ptr);
printf("ptr = %s\n",ptr);
free(ptr);
ptr = NULL;
}
如何避免野指针:
(1)当指针没有做初始化,即没有指向时,将指针指为NULL。一方面可以提醒自己这个指向NULL的指针不可操作不可访问,另一方面NULL这个标记便于我们检查和避免野指针;
初始化为NULL的目的:一是出现段错误时易改错,二是(void *0) 是0地址,是不允许操作,不允许访问的。
(2)当想给指针赋值时,检查是否已经给他分配了内存空间,如果没有分配就再用malloc分配;
(3)给指针分配完内存后,不使用时再用free()函数清空内存空间(清空原来的缓冲区),并再将指针指为NULL。
注:void * 为万能指针,可以接收任何类型的指针,但是不能对其取值(不能对他指向的空间进行操作,他只能暂时存放地址)
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C和指针小结(推荐)
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总