当前位置:首页 > 亲子教育 > 正文内容

空类型指针、空指针、野指针

admin2周前 (05-25)亲子教育11

空类型指针、空指针、野指针

<[id_1833518234]>[id_[id_16[id_939466532]5116553]773146785[id_995624270]id_595955898]

空类型指针、空指针、野指针 第1张

void代表一种无类型,而void*则是一种无类型指针,也被称为通用指针。这种指针能够容纳任何类型的指针,指向任何对象类型。因此,我们不能对无类型指针进行解引用操作,必须将其强制转换为特定类型的指针,才能执行解引用。

空类型指针:

[id_1864108888]

空指针-NULL

在C语言中,空指针NULL指的是地址为0的那块空间

#define NULL((void*)0)

这块区域是禁止我们进入的,因此,对NULL对象不能执行解引用c语言空怎么表示,故此,在每次尝试对指针进行解引用之前,我们必须确认它是否为空指针。

野指针

野指针是指向一个非法的或已销毁的内存的指针。

对野指针进行解引用操作是非法的。

百度百科指出,在C/C++这类编程语言里,所谓的悬空指针,是指当指针原本指向的对象被删除后,该指针便失去了指向的有效目标,从而成为悬空指针。而野指针,则是指那些尚未进行初始化的指针。

在这里,我们把悬空指针归为野指针。

造成野指针的原因 1.指针未初始化

int main()
{
	char* p;
	//此时p是野指针
	return 0;
}

由于指针p未经过初始化,它便成为了一个未定义的指针,若在此之后尝试对p进行解引用,将会导致对内存的非法访问c语言空怎么表示,进而引发程序崩溃。

2.指针越界访问

int main()
{
	int arr[] = {1,2,3,4,5};
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ",p[i]);
	}
	return 0;
}

尽管程序目前运行良好,但事实上已经越界访问了数据;尽管仅是访问了那些不合法的内存区域,且并未对这些区域的值进行修改,可能是因为程序尚未捕捉到这一错误,但这并不意味着程序完全无误(编译器也是由人编写的,同样可能含有bug,编译器未能及时报错空类型指针、空指针、野指针,并不意味着我们的代码没有问题!),然而,针对接下来的代码,程序将会直接崩溃。

int main()
{
	int arr[10] = {0};
	int i = 0;
	int* p = arr;
	for (i = 0; i <= 10; i++)
	{
		*p = i;
		p++;
	}
	return 0;
}

因为这里非法访问内存的同时试图改变空间的值,所以程序崩溃。

3.指针指向的空间已经释放

char* fun()
{
	char arr[] = "abc";
	return arr;
}
int main()
{
	char* p = fun();
	printf("%s\n",p);
	return 0;
}

执行程序,给出如下警告

尽管程序并未发生崩溃,然而此处的编程方式是不合规的;arr作为局部变量,一旦函数调用结束,其栈帧就会被销毁,并且回收至操作系统,我们便失去了对这一局部变量空间的访问权限;在此情况下,p便成为了悬垂指针,对*p的访问则构成了对非法内存的访问。

避免野指针

1.指针要进行初始化

指针要有初始值,初始化为NULL,或者有具体的指向。

既然NULL无法执行解引用动作c语言空怎么表示,那么为何指针可以被设定为NULL值?将指针初始化为NULL,其目的仅是赋予它一个指向,然而在实际应用中空类型指针、空指针、野指针,我们无法对NULL进行解引用,因此在使用指针前必须进行有效性检验。

2.使用指针之前要进行有效性判断

在运用指针前,务必确认其是否为空指针,若是空指针,则不得执行解引用动作。

3.避免越界访问

不要进行越界访问操作,即使还是访问不改变值也是非法的

4.不要返回局部变量的地址

当函数执行完毕后,其局部变量空间会被操作系统收回,若此时函数返回了局部变量的地址,那么在函数外部接收该返回值的指针就会变成无效指针。

5.当指针指向的空间释放后,要将该指针置为NULL

通过这种方式,我们能够防止对野指针进行解引用,并且还能有效防止对已动态分配的内存空间进行重复释放。

int main()
{
	int* p = (int*)malloc(10*sizeof(int));
	
	//1.判断有效性
	if (p == NULL)
	{
		return -1;
	}
	
	//2.使用指针
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		p[i] = i;
	}
	
	//3.释放指针指向的空间
	free(p);
	//free(p);//非法操作
	//4.指针置为NULL
	p = NULL;
	free(p);//释放空指针什么都不做
	return 0;
}

加入微信交流群:************ ,请猛戳这里→点击入群

扫描二维码推送至手机访问。

版权声明:本文由生活百事通发布,如需转载请注明出处。

本文链接:https://shbaishi.com/post/2762.html

分享给朋友:

“空类型指针、空指针、野指针” 的相关文章

亲子运动会火爆开展,增强体质促进亲情

亲子运动会火爆开展,增强体质促进亲情

在阳光灿烂的日子里,一场别开生面的亲子运动会如火如荼地开展起来,这不仅是一场体育的盛宴,更是一次增强体质、促进亲情的美好契机。当清晨的第一缕阳光洒在运动场上,那充满活力的气息便扑面而来。家长们和孩子们早早地来到了场地,脸上洋溢着期待的笑容。五颜六色的运动服在阳光下闪烁着光芒,仿佛是一片绚丽的花海,为...

亲子绘画大赛:展现孩子想象力与家庭创意

亲子绘画大赛:展现孩子想象力与家庭创意

在艺术的殿堂中,孩子的想象力犹如璀璨的星辰,闪烁着无尽的光芒;而家庭的创意则如同温暖的阳光,为这光芒增添了绚丽的色彩。亲子绘画大赛,正是一个让孩子的想象力与家庭的创意完美融合的舞台,在这里,每一幅作品都承载着孩子的梦想,每一个家庭都展现出独特的魅力。孩子的想象力是无穷的,他们用稚嫩的画笔描绘出心中的...

亲子木工课程:让孩子体验传统工艺乐趣

亲子木工课程:让孩子体验传统工艺乐趣

在当今快节奏的现代社会中,孩子们往往沉浸在电子设备和虚拟世界中,而忽略了传统工艺的魅力。为了让孩子们能够亲身体验传统工艺的乐趣,我们特别推出了亲子木工课程。这不仅是一门课程,更是一次与孩子共同成长、创造美好回忆的机会。木工,作为一门古老而传统的工艺,蕴含着丰富的文化内涵和创造力。通过亲手制作木制品,...

亲子戏剧表演:释放孩子表演天赋与自信

亲子戏剧表演:释放孩子表演天赋与自信

在孩子的成长过程中,每个孩子都拥有着独特的天赋和潜力。而亲子戏剧表演,无疑是一种能够充分释放孩子表演天赋与自信的绝佳方式。戏剧表演对于孩子来说,不仅仅是一种娱乐活动,更是一种能够培养他们多方面能力的重要途径。通过参与亲子戏剧表演,孩子可以学习到如何表达自己的情感和想法,如何与他人合作,如何在舞台上展...

亲子烘焙课堂:甜蜜中培养孩子责任感

亲子烘焙课堂:甜蜜中培养孩子责任感

在快节奏的现代生活中,我们常常忽略了培养孩子责任感的重要性。而亲子烘焙课堂,无疑是一个绝佳的机会,让孩子们在甜蜜的氛围中,学会承担责任,收获成长。烘焙,是一项充满乐趣和挑战的活动。从挑选食材到准备工具,从搅拌面粉到烘焙出炉,每一个环节都需要孩子们的参与和努力。在这个过程中,孩子们不仅可以学到烘焙的技...

亲子射箭活动:锻炼专注力与亲子协作

亲子射箭活动:锻炼专注力与亲子协作

在如今快节奏的生活中,孩子们往往容易被各种电子产品和琐事所吸引,专注力逐渐下降。而亲子活动则成为了一种有效的方式,帮助孩子们集中注意力,同时增进亲子之间的感情。亲子射箭活动,便是这样一项既有趣又富有教育意义的活动。射箭,作为一项古老而精准的运动,需要参与者具备高度的专注力。当孩子们拿起弓箭,瞄准目标...