如何避免野指针
2016-10-12 21:07
246 查看
野指针:随机指向内存中的一个地址,对于这个地址不一定有访问权,会导致内存泄漏(访问了已经释放的内存,或没有访问权限)。
下面这个程序很好的避免了野指针:
#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 * 为万能指针,可以接收任何类型的指针,但是不能对其取值(不能对他指向的空间进行操作,他只能暂时存放地址)