开发者社区> 陈国林> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C++中野指针和空指针和无类型指针

简介: 一. 野指针 所谓的野指针指的是一个指针变量指向了不可使用的内存空间。 产生野指针三个原因: (1)指针变量创建时候没有被初始化:任何指针变量在创建的时候,不会自动成为NULL指针,它的默认值是随机的,因此该指针就会成为一个野指针,可能指向一块不可使用的内存空间。
+关注继续查看


一. 野指针

所谓的野指针指的是一个指针变量指向了不可使用的内存空间。

产生野指针三个原因:

(1)指针变量创建时候没有被初始化:任何指针变量在创建的时候,不会自动成为NULL指针,它的默认值是随机的,因此该指针就会成为一个野指针,可能指向一块不可使用的内存空间。

         例如char *p;  这样创建一个指针p,指向一个随机的内存地址空间

         所以指针在创建的时候要被初始化,可以讲其初始化为NULL,或指向合法的内存空间

         比如 char *p = NULL ; 或 char *p = new char; //这个时候p就不会是一个野指针

(2)delete或free指针之后没有把指针设置为NULL:delete和free只是把指针所指的内存空间释放掉,而没有对指针本身进行释放。

         比如char *p = new char(4) ; delete[] p; //这时候指针p所指的内存空间被释放,但是指针p本身不为空,但是指针p所指向的内存空间已经不能使用,造成了野指针。正确的做法是及时的把指针p赋值为NULL

         例如下面这个程序

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

strcpy(*p, "hello");

free(p);

if(p != NULL){

      printf("not NULL\n");

}

结果输出”not NULL“,验证上面的结论,应该在free之后马上把p = NULL。

(3)指针操作超过了指向内存空间的作用范围:当指针越界之后也会变成一个野指针


二. 空指针

空指针是一种特殊的指针,表示当前这个指针变量处于空闲状态,没有指向任何有意义的内存空间。

C++中用NULL来表示空指针,NULL是一个符号常量值为0。


三. 无类型指针

无类型指针指的是void *这种指针,表示可以指向任何数据类型。

比如

int n = 3;

int *p = NULL;  //说明指针p此时空闲,没有指向任何有意义的内存空间

void *gp = &n;  //无类型指针gp指向整型变量n

p = (int *)gp;   //把无类型指针转换为整型指针

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

结果输出3,说明无类型指针可以转换成任何数据类型的指针。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
+关注
陈国林
曾任职于阿里巴巴,现就职于美图,专业搬砖100年~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
对象的生命期管理
立即下载
移动与复制
立即下载
继承与功能组合
立即下载