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

【C语言】空指针&野指针学习小结

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

【C语言】空指针&野指针学习小结

0x00 前言

系统版本:Ubuntu 14.04_64

编译工具:gcc (version 4.8.4)

最后更新:2022-08-05

0x01 空指针&野指针小结 1.空指针

概念:特殊的指针变量,表示不指向任何内容
作用:在指针变量创建的时候,可以初始化NULL
注意:不能对空指针进行解引用(取指针指向的地址的内容)等操作

例1:

#include
int main(){

	char *p = NULL;
	strcpy(p, "abcd"); //错误,对空指针指向的内存空间进行拷贝操作
	return 0;
}

例2:

#include

int main(){

	char *p = NULL;
	printf("%02xn", *p);//错误,对空指针进行解引用操作
	return 0;
}

例3:

#include

int main(){

	char *p = NULL;
	printf("%02xn", p);	//正确,输出的NULL地址,一般为0
	return 0;
}
2.野指针

概念:野指针指向一个已经释放的内存或者未申请过的内存空间
注意:不要对野指针进行解引用操作

例4:

#include

int main(){

	char *p = 0x1234;
	strcpy(p, "abcd");//错误,虽热不是空指针,但是没有申请过内存空间
	return 0;
}
1)常见野指针

1.指针变量未初始化
2.释放堆区的指针后没有置空(造成误用)
3.指针操作超越了变量作用域
例5:

#include

int* func()
{
	int a = 10;
	int * p = &a;
	return p;
} 
void test()
{
	//1 指针变量未初始化
	int * p1;
	printf("%dn", *p1); //gcc下可以运行,vs下报错
	
	//2 指针释放后未置空
	int * p2 = (int*)malloc(sizeof(int));
	*p2 = 100;
	printf("%dn", *p2);
	free(p2);
	printf("%dn", *p2); //不报错,但打印乱码,可能造成误用
	p2 = NULL;
	printf("%dn", *p2); //置空后报错,防止误用
	
	//3 指针操作超越变量作用域
	int * p3 = func();
	printf("%dn", *p3);	//系统保留一次局部变量地址func中的p
	printf("%dn", *p3);	//系统释局部变量地址func中的p,打印乱码
}

int main(){
	
	test();
	
	return 0;
}

另外,空指针可以free释放,野指针不能释放。

以上。
参考资料:
1.https://www.bilibili.com/video/BV18y4y1H7pt?p=15&spm_id_from=pageDriver&vd_source=400083cd545d1a00e016c8759f136df3

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

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

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