资讯专栏INFORMATION COLUMN

【C语言基础】野指针与空指针

阿罗 / 3577人阅读

摘要:避免野指针养成良好的编程习惯好的编程习惯可以避免很多问题,道阻且长,但行则将至二空指针是一个值为的宏常量意义为了标志指针变量没有指向任何变量空闲可用,在语言中,通常把赋值给此指针,这样就标志此指针为空指针,没有指向任何空间。

全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持,赠人玫瑰,手有余香!

一:野指针

概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。
说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。
注:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。
代码示例:

int a = 100;int *p;p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义p = 0x12345678; //给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义*p = 1000;  //对野指针进行赋值操作就不可以了

把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义。
给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义。

1.1 :野指针的成因

1. 指针未初始化:指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它所指的空间是随机的。
代码示例:

int main(){	int * p;	*p = 20;	return 0;}

(个人理解:指针变量有操作系统随机赋值,未指向一个具体空间,没有落脚点)
2. 指针越界访问:指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
代码示例:

int main(){	int arr[10] = {0};	int *p = arr;	for(int i = 0; i <= 11; i++)	{		*(P++) = i;//当指针指向的范围超出数组arr的范围,p变成野指针。	}	return 0;}

3 .指针释放后未置空:有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。其实它们只是把指针所指的内存给释放掉,但并没有把指针本身忘记。此时指针指向的就是无效内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
代码示例:

int main(){	int *p = NULL;	p = malloc(10 * sizeof(int));	if (!p)	{		return;	}	//成功开辟内存,可以操作内存。	free(p);	p = NULL;	return 0;}

(个人理解:我们前一天住了个宾馆,第二天退房了,虽然我们知道一个该房间的门牌号,但是保洁阿姨已经收拾了房间,我们就不知道房间里具体是什么样的了,所以我们也没法操作了。)

2.1 :规避野指针

1. 初始化指针;
代码示例:

int main(){	int *p = NULL;	int a = 10;	p = &a;	*p = 20;	return 0;}

2. 避免指针越界;
代码示例:

int main(){	int arr[10] = {0};	int *p = arr;	for(int i = 0; i < 10; i++)	{		*(P++) = i;//严格遵守有效范围。	}	return 0;}

3 避免返回局部变量的地址
代码示例:

int * test(){	int a = 20;	return &a;}int main(){	int *p = NULL;	p = test();	printf("%d/n", *p);	return 0;}

这与变量的作用域有关,局部变量存在栈区,当被调函数结束后 ,栈区上局部变量的内存空间被释放,若再去访问该空间就不合理了。
4. 开辟的指针释放后置为NULL
当指针p指向的内存空间释放时,没有设置指针p的值为NULL。free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。
代码示例:

int main(){	int *p = NULL;	p = malloc(10 * sizeof(int));	if (!p)	{		return;	}	//成功开辟内存,可以操作内存。	free(p);	p = NULL;//避免野指针	return 0;}

5. 养成良好的编程习惯
好的编程习惯可以避免很多问题,道阻且长,但行则将至!!!

二:空指针

*NULL是一个值为0的宏常量:#define NULL ((void )0)

意义:为了标志指针变量没有指向任何变量(空闲可用),在C语言中,通常把NULL赋值给此指针,这样就标志此指针为空指针,没有指向任何空间。

注意:对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针解引用是一个非法的操作,所以在解引用之前,必须确保它不是一个NULL指针。
代码示例:

void test(){	char *p = NULL;	**//给p指向的内存区域拷贝内容**	strcpy(p, "1111"); //err	char *q = 0x1122;	//给q指向的内存区域拷贝内容	strcpy(q, "2222"); //err		}

OK!!!观众老爷们,这里只是介绍了野指针与空指针,如果朋友们觉得有一点点作用的话,希望朋友们能够给予小菜鸟一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜鸟致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123615.html

相关文章

  • C语言】玩转指针——关于指针,你需要掌握的基础知识!

    摘要:如果我们要将的地址保存到中,我们需要我们给指针变量相应的类型。类型的指针是为了存放类型变量的地址这里可以看到,指针的定义方式是类型名指针变量名。如下最后本文介绍的是指针的基础知识,往后还会继续深入讲解指 ...

    zebrayoung 评论0 收藏0
  • C | 指针的相关知识(一)

    摘要:上述代码的结果为则表示这两个指针之间相差了个整型元素。指针和数组我在数组的相关知识里也讲到,数组名大多数情况下就表示首元素的地址。 这目录 前言指针的概念指针和指...

    novo 评论0 收藏0
  • C语言】从入门到入土(指针篇)

    摘要:在位机器上,如果有个地址线,那一个指针变量的大小是个字节,才能存放一个地址。就是一个指针变量,也有自己的类型,指针变量的类型我们可以发现指针的定义方式是类型星号。也就是说存储什么变量类型就用什么指针变量类型。 ...

    陈伟 评论0 收藏0
  • C语言中的指针初阶

    摘要:语言中的指针初阶指针是什么指针和指针类型野指针指针的运算指针和数组二级指针指针数组指针是什么指针是什么初学者都有一个疑问,那就是指针是什么简单的说,就是通过它能找到以它为地址的内存单元。是用来存放地址指针,所以是指针变量。 ...

    jubincn 评论0 收藏0
  • C语言指针篇——你必须要掌握的指针基础知识

    摘要:一指针概述指针是个变量存放内存单元的地址编号。即存放指针变量的地址的指针二级指针指向的空间的值是一个一级指针。总结指针是语言非常重要的一部分内容繁多不易懂本文仅介绍了一些基本知识后续还会深入了解指针。 ...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

最新活动
阅读需要支付1元查看
<