c语言:理解和避免野指针

野指针的定义:

野指针是指一个指针变量存储了一个无效的地址,通常是一个未初始化的指针或者指向已经被释放的内存地址。当程序尝试使用野指针时,可能会导致程序崩溃、内存泄漏或者其他不可预测的行为。因此,在编程中需要特别注意指针的初始化和内存的释放,以避免出现野指针问题。

我用自己的语言解释一下:假设你有一个指针变量,它应该指向一个有效的内存地址,比如一个变量或者对象。但是有时候,这个指针可能没有被正确初始化,或者指向的内存地址已经被释放了。这样的指针就被称为野指针。

举例说明

1.未初始化的指针:

当一个指针变量未被明确初始化时,它会包含一个随机的内存地址,这可能会导致它成为野指针。

cpp 复制代码
int *ptr;
*ptr = 5;  // 未初始化的ptr指针成为野指针

正确写法:初始化指针并分配内存

cpp 复制代码
int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指针指向的内存时释放内存

2.指针指向已释放的内存:

当指针指向的内存已经被释放,但指针仍然保留着这个地址。

cpp 复制代码
int *ptr = malloc(sizeof(int));
free(ptr);
*ptr = 10;  // ptr指向的内存已经被释放,ptr成为野指针

正确写法:使用静态或动态分配的内存,确保指针不指向已释放的内存

cpp 复制代码
int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指针指向的内存时释放内存
ptr = NULL; // 将指针设置为NULL,以避免成为野指针

3.指针指向超出作用域的局部变量:

当指针指向一个局部变量,并且在该变量的作用域之外被访问时,会导致野指针问题。

cpp 复制代码
int *createInt() 
{
    int num = 10;
    return #
}

int main() 
{
    int *ptr = createInt();
    *ptr = 20;  // createInt函数返回的指针指向了已经超出作用域的局部变量num,ptr成为野指针
}

正确写法:避免指针指向超出作用域的局部变量。

cpp 复制代码
int *createInt() 
{
    int *num = malloc(sizeof(int));
    *num = 10;
    return num;
}

int main() 
{
    int *ptr = createInt();
    *ptr = 20;
    // 使用ptr
    free(ptr); // 在不需要指针指向的内存时释放内存
}

4.指针指向未分配的内存:

当指针指向未分配内存的地址时,会导致野指针问题。

cpp 复制代码
int *ptr = NULL;
*ptr = 5;  // ptr指向未分配的内存,成为野指针

正确写法:指针指向未分配的内存时需要先分配内存再使用。

cpp 复制代码
int *ptr = malloc(sizeof(int));
*ptr = 5;
// 使用ptr
free(ptr); // 在不需要指针指向的内存时释放内存
相关推荐
楼田莉子3 分钟前
设计模式:创建型设计模式简介
服务器·开发语言·c++·设计模式
好家伙VCC6 分钟前
**基于Colab的高效Python深度学习开发流程:从环境配置到模型部署全流程实战**在当前人工智
java·开发语言·python·深度学习
啦啦啦!12 分钟前
c++AI大模型接入SDK项目
开发语言·数据结构·c++·人工智能·算法
lcj251114 分钟前
【C语言】自定义类型1:结构体
c语言·开发语言·算法
jaysee-sjc17 分钟前
十七、Java 高级技术入门全解:JUnit、反射、注解、动态代理
java·开发语言·算法·junit·intellij-idea
cmpxr_26 分钟前
【C】隐式类型转换
c语言·c++·算法
泛凡(Linyongui)27 分钟前
PY32F002B实践之三--宠物腹背理疗仪项目功能代码分析说明
c语言·keil·32位单片机·腹背理疗仪项目实践·普苒py32
Dxy123931021631 分钟前
Python使用SymSpell详解:打造极速拼写检查引擎
开发语言·python
时寒的笔记35 分钟前
js7逆向案例_禁止f12打开&sojson打开
开发语言·javascript·ecmascript
大鹏说大话39 分钟前
什么是“过早优化”?
开发语言