文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言基础野指针与空指针示例分析

2024-04-02 19:55

关注

一:野指针

概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。

说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。

注:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。

代码示例:


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. 指针未初始化

指针变量刚被创建时不会自动成为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;
}

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

规避野指针

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯