野指针?空指针?

野指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针。而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越了变量的作用范围。

例如如下程序示例。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main()

       char *p = (char *) malloc(100);

       strcpy(p, "hello");

       free(p);

       if(p != NULL)

              printf("Not NULL\n");

       return 0;

}

程序输出为

Not NULL

上例中,虽然对p执行了free操作,p 所指的内存被释放掉了,但是p所指的地址仍然不变,在后续的判断p是否为NULL时,根本没有起到防错的作用,所以程序输出仍然为Not NULL。

空指针是一个特殊的指针,也是唯一一个对任何指针类型都合法的指针。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的内容。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL,程序里可以写 p = 0 或者 p = NULL,两种写法都把p置为空指针值。C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。

作为一种风格,很多程序员一般不愿意在程序中到处出现未加修饰的 0,所以习惯定义预处理宏 NULL(在 <stdio.h> 和其它几个头文件中)为空指针常数,通常是0 或者 ((void *)0)。希望区别整数0和空指针0的人可以在需要空指针的地方使用 NULL。

通用指针可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。

例如如下程序代码:

#include <stdio.h>

 

int main()

       int n=3, *p;

       void *gp;

       gp = &n;

       p=(int *)gp;

       printf("%d\n",*p);

       return 0;

}

程序输出为

3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值