野指针[概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)]
一、野指针成因
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;
}
实际在绝大部分的编译器上是可以顺利完成任务
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
##野指针
张小明
前端开发工程师
GPT-SoVITS用于智能客服语音回复的架构设计
GPT-SoVITS用于智能客服语音回复的架构设计 在当今企业服务数字化转型的浪潮中,智能客服早已不再是简单的“关键词匹配固定话术”系统。用户期待的是更自然、更具人格化的交互体验——就像对面坐着一位熟悉业务、语气亲切的真人客服。而要实现这种拟人化沟通&#x…
终极指南:Joy-Con手柄PC端完全适配与创新应用
终极指南:Joy-Con手柄PC端完全适配与创新应用 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 一、环境搭建:从零开始构建连接基…
70、Kerdock与Preparata码:原理、性质与应用
Kerdock与Preparata码:原理、性质与应用 1. Kerdock码基础 Kerdock码是一类重要的编码,其长度为 $2^{r + 1}$ 的二进制Kerdock码可定义为特定长度为 $n = 2^r - 1$ 的循环 $\mathbb{Z}_4$ 线性码扩展码的Gray图像。 - 定义步骤 : 1. 选取一个 $r$ 次本原基本不可约多项…
71、代数几何编码:理论与经典示例解析
代数几何编码:理论与经典示例解析 1. 代数几何编码概述 自1977年V. D. Goppa发现利用代数几何的编码以来,对这类编码的研究大量涌现。1982年,Tsfasman、Vl˘adut和Zink证明了某些代数几何编码超越了渐近吉尔伯特 - 瓦尔沙莫夫界,这一成果让人们意识到了代数几何编码的重要…
掌握Sketch文本批量替换:3个实战技巧让设计效率翻倍
掌握Sketch文本批量替换:3个实战技巧让设计效率翻倍 【免费下载链接】Sketch-Find-And-Replace Sketch plugin to do a find and replace on text within layers 项目地址: https://gitcode.com/gh_mirrors/sk/Sketch-Find-And-Replace 还在为设计稿中重复修…
B站缓存转换神器:一键将m4s文件无损转MP4格式
你是不是也遇到过这样的情况:在B站缓存了喜欢的视频,想要在手机、平板或者车载设备上播放时,却发现这些.m4s格式的文件根本无法识别?😕 别担心,今天我们就来彻底解决这个困扰无数B站用户的技术难题…