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

空指针:

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

  1 #include <stdio.h>
  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 <stdio.h>
  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 <stdio.h>
  2 #include <stdlib.h>
  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 <stdio.h>
  2 #include <stdlib.h>
  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*类型!!!


--------------------- 
作者:杜重阳 
来源:CSDN 
原文:https://blog.csdn.net/dcy15244/article/details/78414663 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值