C语言的“空指针”与“野指针”

空指针:

在C语言里,泛型编程靠void类型来实现。即“一切皆空”,那么void类型的指针,是不是大大的提供了某些方便!在使用void*类型的指针时应该注意一下问题:(类型转换!)

  1 #include
  2
  3 int main()
  4 {
  5         int a=10;
  6         void *p=&a;
  7
  8         int b= (int)*p;// 类型强转,错误!
  9
 10         return 0;
 11 }

以上显然是错误的!因为在强转时,转换的是指针类型而不是普通类型。应先解引用,再转换!应该这样写:

  1 #include
  2
  3 int main()
  4 {
  5         int a=10;
  6         void *p=&a;
  7
  8         int b= *(int*)p;// 类型强转, 正确!
  9         printf("%d\n",b);
 10         return 0;
 11 }

                                           

野指针:

所谓“野指针”,即指向一个非法的或者已经销毁的内存的指针,它存在于使用指针前于使用指针后!那么以下提供两种方式来避免野指针:


  1 #include
  2 #include
  3 int main()
  4 {
  5
  6         int *p;// 指针变量未初始化,危险!
  7         printf("%p\n",p);
  8
  9         int *pp=(int*)malloc(4);
 10        free(pp);
 11        printf("%p\n",pp);//指针变量未清空已销毁地值,危险!
 12
 13         return 0;
 14 }

以上两种情况,分别是使用指针之前与使用指针变量之后,都是不合理,不安全的!使用前,应先将指针置为空!,使用后应该将指针变量的地址值置为空,否则即野指针!!!

  1 #include
  2 #include
  3 int main()
  4 {
  5
  6         int *p=NULL;// 正确
  7         printf("%p\n",p);
  8
  9         int *pp=(int*)malloc(4);
 10         free(pp);
 11         pp=NULL;
 12         printf("%p\n",pp);//正确!
 13
 14         return 0;
 15 }
~                                      

这里还要注意malloc函数只能对堆区内存释放,不可释放栈区!栈区是自动释放的!!!并且它返回的是void*类型!!!







你可能感兴趣的:(C语言程序设计)