51-指针_野指针,指针运算

news2024/11/24 19:29:58

51-1 野指针

51-1-1 什么是野指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

没有初始化

int main()
{
	int* p;
	//p没有初始化,就意味着没有明确的指向
	//一个局部变量不初始化的话,放的是随机值:0xcccccccc
	*p = 10;  //非法访问内存,这里的p就是野指针
	return 0;
}

指针越界访问

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

i=10时,变成野指针

指针指向的空间释放

int* test()
{
	int a = 10;
	return &a;
}

int main()
{
	int* p = test();  //已经接收地址,但函数中的地址已经销毁
	return 0;
}

51-1-2 解决方案

1、指针初始化

2、小心指针越界

3、指针指向空间释放及时置NULL

4、避免返回局部变量的地址

5、指针使用之前检查有效性

初始化为具体值

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

初始化为NULL

int main()
{
	int* p2 = NULL;
	*p2 = 100;
	return 0;
}

正确代码

int main()
{
	int* p3 = NULL;
	if (p3 != NULL)
	{
		*p3 = 100;
	}
	return 0;
}

51-2 指针运算

51-2-1 指针+-整数

#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	//指针+-整数:指针的关系运算
	for (vp = &values[0]; vp < &values[N_VALUES];)
	{
		*vp++ = 0;
		//相当于:
		//*vp=0;
		//vp++;
	}
	return 0;
}

*vp++与(*vp)++的区别:

*vp++:分为两步:*vp;vp++;

(*vp)++:对vp进行解引用再++,即对vp指向的内容++

为数组元素赋值的三种方法:

代码1:

int main()
{
	int arr[10] = {0};
	int sz = sizeof(arr[10]) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = 1;
	}
	return 0;
}

代码2:

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

代码3:

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

51-2-2 指针-指针

问:下列代码的结果?

答:9

代码1:

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);
	return 0;
}

结果1:

代码2:

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[0] - &arr[9]);
	return 0;
}

结果2:

解析:

中间只隔9个元素

​​​​​​​

原因:|指针-指针|(绝对值)得到的是指针之间的元素个数

注:不是所有的指针都能相减,指向同一块空间的指针才能相减

使用场景举例:自己写一个写strlen函数

代码1 while循环

int my_strlen(char* str)
{
	int count = 0;
	while (*str!= '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char str[] = "abcdef";
	int len = strlen(str);
	printf("%d\n", len);
}

代码2 指针-指针

int my_strlen(char* str)
{
	char* str_start = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - str_start;
}
int main()
{
	char str[] = "abcdef";
	int len = strlen(str);
	printf("%d\n", len);
}

结果均为6

或许有uu会疑问,可以指针+指针吗?

我们通常不会这样用。就像我们经常用日期-日期算时间,但是没有用过日期+日期,没有意义

51-2-3 指针的关系运算

为数组元素赋值:

代码1

#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	for (vp = &values[N_VALUES]; vp > &values[0];)
	{
		*--vp = 0;
	}
	return 0;
}

代码2 

#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	for (vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
	{
		*vp = 0;
	}
	return 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

图解:

p1可以跟p3比较,不能跟p2比较 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文说透组织中的利润中心建设

当前&#xff0c;规模型企业越来越重视利润中心建设&#xff0c;华为的实践表明&#xff0c;建好了利润中心&#xff0c;利润自然好&#xff0c;组织也会上台阶。很多企业利润上不去&#xff0c;就是没有搞好利润中心这个火车头。然而&#xff0c;很多人误以为利润中心只是财务…

Cesium与Three相机同步(2)

之前实现了将Three相机同步到Cesium相机Cesium与Three相机同步(1)-CSDN博客 现在是将Cesium相机同步到Three相机,从而实现了相机双向同步。 <!DOCTYPE html> <html lang="en"><head><title>three.js webgl - orbit controls</title&g…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

OpenCV:入门(五)

图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也 较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值也较小。一般情 况下&#xff0c;图像梯度计…

k8s 1.28.10 浏览器访问6443查看api,需要证书

添加证书 使用client-certificate-data和client-key-data生成一个p12文件 1.生成client-certificate-data grep client-certificate-data ~/.kube/config | head -n 1 | awk {print $2} | base64 -d >> kubecfg.crt2.生成client-key-data grep client-key-data ~/.kub…

深 渔博会成功举办 新文件促进城市数字化转型| 产业互联网观察174期

深圳渔博会水产品竞价交易会成功举办 首批数据跨境一般数据清单发布 新文件加快城市全域数字化转型进程 | 产业互联网观察第174期 2024深圳渔博会水产品竞价交易会成功举办 5月17日至18日&#xff0c;深圳渔博会上深圳国际金枪鱼交易有限公司在深圳会展中心成功举办了水产品竞…

使用Prometheus + Blackbox-exporter快速监控一个网站性能和SSL过期时间

使用blackbox-exporter快速监控一个网站性能和SSL过期时间 环境介绍什么是blackbox-exporter下载blackbox-exporter安装blackbox-exporter配置Prometheus服务端查看job上线监控面板参考文献 环境介绍 本文实验环境 操作系统&#xff1a;Centos 7.9Prometheus版本&#xff1a;…

U-Mail邮件系统为用户提供更加安全的数据保护机制

据外媒报道&#xff0c;近日美国国家安全委员会泄露了其成员的近1万封电子邮件和密码&#xff0c;暴露了政府组织和大公司在内的2000家公司。其中包括美国国家航空航天局和特斯拉等。报道称该漏洞于3月7日被研究人员发现&#xff0c;通过该漏洞攻击者能够访问对web服务器操作至…

哪款电脑桌面日历记事本软件好用?推荐优秀的电脑日历记事本

对于众多上班族而言&#xff0c;每天在电脑前忙碌已成为生活常态。若想提升工作效率&#xff0c;简化繁琐的工作流程&#xff0c;选择一款出色的电脑桌面日历与记事本软件就显得至关重要。 然而&#xff0c;在Windows操作系统上设定提醒显得相当繁琐&#xff0c;而系统自带的记…

创新力作 焕新首发丨捷顺科技·捷曜系列智慧停车新品全新上市

2024捷顺科技智慧停车全家族新品全面上市 全新外观、全新特性、全新体验 新控制机、新道闸、新超眸相机... 每款新品都有哪些功能亮点 带您一探究竟

影响程序员发展,首个关于“软件供应链安全”国家标准发布,你该知道的10个问题!【附标准全文】

近日&#xff0c;GB/T 43698-2024《网络安全技术 软件供应链安全要求》作为国内首个软件供应链安全的国标&#xff0c;对于程序员的影响深远。该标准的实施&#xff0c;不仅为程序员提供了明确的软件安全开发指导&#xff0c;还强化了他们在软件开发过程中对安全性的重视。程序…

如何解决Nginx反向代理不生效?

目录 背景 过程 日志 检查配置文件 重启服务 检查容器内的配置文件 容器和宿主机 其他 背景 用了两年的nginx新加的反向代理不生效 Docker挂载的配置文件启动的Nginx&#xff0c;配置一切正常&#xff0c;但是反向代理不生效&#xff0c;???先自查一波 过程 日志 …

废物回收机构|基于SprinBoot+vue的地方废物回收机构管理系统(源码+数据库+文档)

地方废物回收机构管理系统 目录 基于SprinBootvue的地方废物回收机构管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2 员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

【ZYNQ】GPIO 与 AXI GPIO

在嵌入式开发中&#xff0c;GPIO 是最常见的外设。GPIO 是 General Purpose I/O 的缩写&#xff0c;译为通用输入/输出。GPIO 用于连接外部设备&#xff0c;例如按键、传感器等&#xff0c;实现数字信号的输入或输出功能。本文主要介绍 Zynq GPIO 的基本概念&#xff0c;并对比…

AIGC基础教学:AI+建筑设计,一场划时代变革的序幕已经拉开

2015年9月&#xff0c;美的集团本着把艺术融入民间的理念&#xff0c;邀请了安藤忠雄设计正在筹建中的美术馆。 在历经长达近120天的设计工作之后&#xff0c;美术馆于同年12月动工。这座具有岭南建筑文化意境的美术馆&#xff0c;后来荣获2020年美国建筑大师奖(Architecture …

VMM5310替代方案 (LT8713SX)三路DP或者三路HDMI

兼容USB上的VESA DisplayPort Alt模式 c型标准1.0b ▪DP Alt模式支持引脚分配C, D和E ▪符合USB供电规范3.0 ▪兼容USB Type-C电缆和连接器 规范1.3 ▪内置三CC逻辑和PD控制器充电器和 正常的沟通 ▪支持UFP和DFP数据角色 ▪支持电源&#xff0c;接收器和DRP电源角色 …

Tina-Linux -- 5. 网络通信(有线网络,无线网络,SSH链接)

有线网络 bash 指令 ifconfig eth0 192.168.2.222 netmask 255.255.255.0 up route add default gw 192.168.2.1开机自启 修改网络设置文件 /etc/init.d/S40network #!/bin/sh # # Start the network.... ## Debian ifupdown needs the /run/network lock directory mkdir …

明天(周六)下午!武汉Linux爱好者线下沙龙,我们在华中科技大学等你!

2024 年 5月 25 日&#xff08;周六&#xff09;下午&#xff0c;我们将在「武汉市洪山区」 珞喻路 1037 号华中科技大学南五楼 613 室举办武汉 Linux 爱好者线下沙龙&#xff08;WHLUG&#xff09;&#xff0c;欢迎广大 Linux 爱好者来到现场&#xff0c;与我们一同交流技术&a…

flutter开发实战-flutter播放PAG动画

flutter开发实战-flutter播放PAG动画 最近开发过程中&#xff0c;遇到了PAG动画&#xff0c;这里进行记录一下。 一、什么是PAG&#xff1f; 官网&#xff1a;https://pag.art/ Portable Animated Graphics 是一套完整的动效工作流解决方案。 目标是降低或消除动效相关的研…

【小tips】当机器里面有多个版本的gcc时,该如何切换当前的gcc版本?

背景切换gcc版本 背景 有时候因为项目需求&#xff0c;可能不同的项目需要不同的gcc版本&#xff0c;所以机器上会安装多个版本的gcc&#xff0c;那我们如何切换到想要使用的版本&#xff1f; 切换gcc版本 比如我的机器上有两个版本的gcc&#xff1a; 我当前的版本是gcc-4…