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