您现在的位置是:群英 > 开发技术 > 编程语言
C语言的野指针是什么意思,有何用处?
Admin发表于 2021-12-27 19:05:502523 次浏览

    学习C语言的朋友都清楚C语言中指针是比价难学习和理解的知识,一些朋友在学习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		
}

   现在对于C语言野指针和空指针都了解了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多C语言指针的内容,可以继续浏览群英网络其他相关的文章。

文本转载自脚本之家

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: c语言野指针
相关信息推荐
2022-01-13 19:00:09 
摘要:Python去除字符串空格怎样做?Python中要实现去除字符串所有空格有很多方法,例如利用strip()方法、lstrip()方法、rstrip()方法、replace()方法等等,具体怎样实现呢?下面我们一起来看看实现代码怎样写。
2022-05-16 11:38:22 
摘要:本篇文章给大家带来的内容是关于HTML5中五种存储方式的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
2022-05-10 11:16:11 
摘要:bootstrap获取table数据的方法:1、通过表格参数url来获取;2、通过“$.get()”方式来操作,并用表格参数的data来自定义方法去接收数据的格式即可。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部