栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

野指针、悬空指针、空指针以及万能指针(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

野指针、悬空指针、空指针以及万能指针(C语言)

我们在使用指针的时候,总是会遇到各种稀奇古怪的问题,但万变不离其宗,下面我们一起来学习指针的各种状态。

野指针

野指针(wild pointer)就是没有被初始化过的指针。

【示例:】

#include
int main()
{
   int *p;
   printf("%dn",*p);
   return 0;
}

如果用Vs编译,会直接报错error C4700: 使用了未初始化的局部变量“p”,还是比较人性的,从根本上避免了野指针。

空指针

空指针就是被赋值为NULL的指针,它不指向任何的对象或者函数。(坚决不能使用空指针,否则程序就会崩)

空指针的出现是为了避免错误的引用指针而导致的难以排查的问题,不过空指针也不能直接访问,但是可以用来判断。

【示例:】

#include
int main()
{
   int* p = NULL;
   //判断指针是否为NULL
   if (p != NULL)
  {
       printf("%dn", *p);
  }
   return 0;
}

如果把指针值为空,则可以进行判断,就算没有判断,直接对空指针进行引用,产生的报错也非常好理解。

悬空指针*

悬空指针是指针最初指向的内存已经被释放了的一种指针。

【示例:】从函数中返回临时变量的地址

#include

int* foo()
{
   int age = 18;   //函数执行完毕,age的内存会被自动释放
   return &age;   
}

int main()
{
   int* p = foo();
   //getchar();
   printf("%dn", *p);
   return 0;
}

运行上面的代码,貌似没有任何问题,的确如此,但不代表这个代码是正确的。现在我们把main函数中的getchar的注释放开,然后重新运行程序,等待几秒之后按下任意键,发现输出的结果已经不对了。

为什么?一开始的时候我们没有getchar,foo函数返回之后,接着立马输出*p,这个时候函数里面的age还没有来得及释放,所以输出没问题,但是当我们使用getchar等待一段时间后,age有足够的时间释放了,所以就会输出垃圾值。

注意:悬空指针是编码过程中最容易出现问题的,切记,认真检查!

万能指针

void* 类型的指针又叫万能指针,他可以指向任意的内存空间地址。

1. 可以指向任何地址

int maye = 20;
void* p = &maye;

2. 可以隐式自动转换为其他类型指针

int* pi = p;

3. 不能对void*取值操作,因为它没有类型,或者说不能判断存储的是什么类型,需要强转指定一个确定的类型才能使用

printf("%dn",*p);    //error
printf("%dn",*(int*)p);//right

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号