野指针[概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)]
一、野指针成因
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;
}
实际在绝大部分的编译器上是可以顺利完成任务
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
##野指针
张小明
前端开发工程师
RuoYi-Flowable-Plus工作流平台:零基础快速上手全攻略
RuoYi-Flowable-Plus工作流平台:零基础快速上手全攻略 【免费下载链接】RuoYi-Flowable-Plus 本项目基于 RuoYi-Vue-Plus 进行二次开发扩展Flowable工作流功能,支持在线表单设计和丰富的工作流程设计能力。如果觉得这个项目不错,麻烦点个star…
7种字重免费商用字体深度解析:思源宋体完整使用手册
7种字重免费商用字体深度解析:思源宋体完整使用手册 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业设计项目寻找既专业又无需担心版权问题的中文字体吗…
GPT-SoVITS语音风格迁移潜力分析
GPT-SoVITS语音风格迁移潜力分析 在短视频、虚拟主播和个性化内容爆发的今天,人们不再满足于千篇一律的“机器音”。我们期待听到更自然、更有情感、甚至带有个人印记的声音——比如用自己说话的方式读出一段外语,或是让AI以偶像的声线朗读一封情书。这种…
78、卷积码相关知识详解
卷积码相关知识详解 1. 卷积码基础 在卷积码中,定义了一个具有无限行和列的二进制矩阵 $B(G)$: [ B(G) = \begin{bmatrix} B_0 \ B_1 \ B_2 \ \cdots \ B_M \ B_0 \ B_1 \ B_2 \ \cdots \ B_M \ B_0 \ B_1 \ B_2 \ \cdots \ B_M \ \cdots \ \cdots \ …
智能定位突破:企业微信远程打卡的4大核心解决方案
智能定位突破:企业微信远程打卡的4大核心解决方案 【免费下载链接】weworkhook 企业微信打卡助手,在Android设备上安装Xposed后hook企业微信获取GPS的参数达到修改定位的目的。注意运行环境仅支持Android设备且已经ROOTXposed框架 (未 ROOT 设…
81、二元卷积码的软判决解码算法
二元卷积码的软判决解码算法 1. 双向 APP 解码算法 1.1 算法概述 双向后验概率(APP)解码是一种用于二元卷积码的软判决解码算法。该算法在每个时间点计算消息符号为 0 的概率,基于接收到的向量和信道概率。这些概率可用于两个方面:一是解码器据此决定消息符号是 0 还是 …