野指针[概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)]
一、野指针成因
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能否在Mac M系列芯片运行?
GPT-SoVITS 能否在 Mac M 系列芯片上运行? 近年来,个性化语音合成正从实验室走向桌面。越来越多的开发者希望在本地设备上完成语音克隆任务——无需依赖云端 API,既能保护隐私,又能灵活调试模型。其中,GPT-SoVITS 作为…
GPT-SoVITS单位符号发音规则库建设
GPT-SoVITS单位符号发音规则库建设 在科研报告朗读、工业数据播报或医学仪器语音提示等专业场景中,一个看似微不足道的问题却常常令人尴尬:TTS系统把“37C”读成了“三十七C”,或将“5 m/s”念作“五米每秒平方”而非标准的“米每二次方秒”。…
OpenPLC Editor:零基础也能上手的工业自动化编程神器
在工业4.0时代,自动化控制技术正以前所未有的速度发展。OpenPLC Editor作为一款功能强大的开源PLC编程软件,正在重新定义工业控制编程的入门门槛。这款基于Beremiz项目的专业工具,让每个人都能轻松掌握工业自动化编程的核心技能。Ἲ…
76、卷积码的维特比解码算法详解
卷积码的维特比解码算法详解 1. 引言 在通信领域,卷积码是一种非常重要的编码方式,而维特比解码算法则是用于解码卷积码的经典算法。本文将详细介绍维特比解码算法,包括相关的状态图、网格图的概念,以及算法的具体步骤和应用实例。 2. 相关练习与基础概念 2.1 编码器练…
80、软判决、迭代解码与维特比算法的拓展应用
软判决、迭代解码与维特比算法的拓展应用 1. 信噪比下限与软判决维特比算法基础 在通信领域,信号处理与解码算法至关重要。首先来看不同速率 (R) 下信噪比的下限情况,如下表所示: | (R) | (\frac{3}{4}) | (\frac{1}{2}) | (\frac{1}{3}) | (\frac{1}{6}) | | — | — |…
84、航天器通信中的编码与解码技术
航天器通信中的编码与解码技术 1. 伽利略号探测器的通信挑战与解决方案 在1991年,也就是伽利略号探测器发射两年多后,其解码器已具备每秒处理100万比特数据的能力。然而,在前往木星的途中,原本设计用于以每秒10万比特速率传输数据的高增益X波段天线未能正常展开。这一故障…