news 2026/5/5 14:28:29

##野指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
##野指针

野指针[概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)]
一、野指针成因
1. 指针未初始化
int main()
{
int* p;
//p没有初始化,就意味着没有明确的指向
//一个局部变量不初始化的化,放的是随机值:0xcccccccc
//
*p = 10;//非法访问内存了,这里的p就是野指针
return 0;
}
2. 指针越界访问
int main()
{
int arr[10] = { 0 };
int* p = arr;//&arr[0]
return 0;
}


int* test()
{
int a = 10;
return &a;
}
int main()
{
int*p = test();
if (p != NULL)
{
printf("%d\n", *p);//
}
return 0;
}

3. 指针指向的空间释放

二、如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

三、指针运算
1.指针+整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}
int main()
{
int arr[10] = {0};
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//数组下标的写法
//for (i = 0; i < sz; i++)
//{
// arr[i] = 1;
//}

int* p = arr;
for (i = 0; i < sz; i++)
{
*p = 1;
p++;
}
return 0;
}


2.指针-指针
int my_strlen(char *s)
{
char *p = s;
while(*p != '\0' )
p++;
return p-s;
}


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

PS:指针-指针得到的是指针和指针之间元素的个数
不是所有的指针都能相减
指向同一块空间的2个指针才能相减


(1)
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
//(2)递归的版本

//(3) 指针-指针
int my_strlen(char* str)
{
char* start = str;
while (*str != '\0')
{
str++;
}
return (str - start);
}

int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}
```

3. 指针的关系运算
for(vp = &values[N_VALUES]; vp > &values[0];)
{
*--vp = 0;
}
代码简化,这将代码修改如下:
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
*vp = 0;
}
实际在绝大部分的编译器上是可以顺利完成任务

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 21:07:23

JLink烧录器固件烧录步骤一文说清

JLink烧录器固件修复实战&#xff1a;从“变砖”到重生的完整指南 在嵌入式开发的世界里&#xff0c;JLink不是工具——它是工程师的“调试命脉”。 当你的代码写得飞起、逻辑清晰如泉涌&#xff0c;却因为一个“ Cannot connect to J-Link ”弹窗卡住整个项目进度时&#…

作者头像 李华
网站建设 2026/5/1 17:37:04

终极指南:Jellyfin界面定制工具插件完整使用教程

Jellyfin界面定制工具插件是专为Jellyfin媒体服务器设计的革命性界面个性化工具。无论您是技术新手还是资深用户&#xff0c;这款插件都能让您在几分钟内完成界面美化&#xff0c;彻底告别繁琐的CSS手动修改。&#x1f4ab; 【免费下载链接】jellyfin-plugin-skin-manager 项…

作者头像 李华
网站建设 2026/5/5 0:03:55

鸣潮120帧完美配置全攻略:三步搞定帧率解锁

还在为鸣潮游戏卡顿而烦恼吗&#xff1f;想要体验丝滑流畅的120帧游戏画面却总是失败&#xff1f;别担心&#xff0c;这并非你的操作问题&#xff0c;而是游戏版本更新后的常见现象。本文将为你提供最完整的鸣潮120帧解锁方案&#xff0c;通过WaveTools配置让你轻松实现游戏优化…

作者头像 李华
网站建设 2026/5/1 16:05:09

什么值得买自动签到脚本终极指南:快速部署实现积分自动化

想要轻松获取什么值得买每日积分奖励&#xff0c;告别繁琐的手动签到操作吗&#xff1f;本教程将为你详细介绍如何使用什么值得买自动签到脚本&#xff0c;实现积分管理的完全自动化。通过这个简单易用的签到工具&#xff0c;你可以享受免手动操作的便捷体验&#xff0c;确保每…

作者头像 李华
网站建设 2026/5/2 12:56:17

UE4SS工具在虚幻引擎游戏中的Lua脚本注入问题深度解析

UE4SS工具在虚幻引擎游戏中的Lua脚本注入问题深度解析 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS 问题背景…

作者头像 李华
网站建设 2026/5/3 10:32:52

72、代数几何中的编码理论与代数曲线研究

代数几何中的编码理论与代数曲线研究 1. 戈帕码的另一种表述 戈帕码可以有另一种表述方式。设 $R$ 是所有系数在 $F_{q^t}$ 中的有理函数 $f(x) = \frac{a(x)}{b(x)}$ 构成的向量空间,其中 $a(x)$ 和 $b(x)$ 互质,并且满足两个条件: - 条件一:$a(x)$ 的零点包含 $G(x)$ …

作者头像 李华