c++/c中野指针和悬空指针的示例

目录

一、野指针的概念

二、野指针示例

三、悬空指针的概念

四、悬空指针示例

1.指针释放后未置空

2.返回栈内存地址的指针


一、野指针的概念

野指针是指尚未初始化的指针,它指向的地址是未知的、不确定的、随机的。这种指针在使用时可能导致程序崩溃、数据损坏或其他不可预见的错误。

二、野指针示例

指针变量尚未初始化

复制代码
int main() {  
    int* ptr; // 声明一个指针ptr,但未初始化  
    *ptr = 20; // 尝试向p指向的内存地址写入20,但由于ptr是野指针,指向的地址未知,这可能导致程序崩溃  
    return 0;  
}

解决方法:在声明指针时立即初始化它,或者确保在使用之前进行初始化。

复制代码
int *ptr = NULL; // 将指针初始化为NULL

三、悬空指针的概念

悬空指针指的是一个指针变量指向了已经被释放(例如,通过调用deletefree)的内存地址。此时,由于这块内存可能已经被操作系统重新分配给其他程序使用,或者其内容已经被改变,再次通过悬挂指针访问该内存地址可能会导致未定义的行为,比如程序崩溃、数据损坏等。

四、悬空指针示例

1.指针释放后未置空

当一个指针指向的内存被deletefree释放后,这块内存可能已经被操作系统回收并重新分配给其他程序使用。此时,如果继续使用该指针访问内存,就可能导致悬空指针问题。

示例:

cpp 复制代码
int main() {
    int *ptr = (int*)malloc(sizeof(int));   // ptr分配了一个int类型的字节大小为4
    *ptr = 10;  
    free(ptr); // 释放内存,但ptr没有被置为NULL  
    // ... 一些其他代码 ...  
    *ptr = 20; // 继续访问,可能导致程序崩溃或数据损坏
}

解决方法:在释放完内存之后,将指针置为NULL。

2.返回栈内存地址的指针

如果一个指针指向了一个对象,但该对象的生命周期已经结束(例如,一个局部对象在函数返回后),那么该指针就变成了悬空指针。因为该对象所占用的内存可能已经被回收或覆盖,再次通过该指针访问该对象将导致未定义的行为。

示例:

cpp 复制代码
int main() {
    int* getStackValue() {  
        int a = 20;  
        return &a; // 返回栈内存地址的指针
    }  
  
    int main() {  
        int *ptr = getStackValue();  
        printf("%d\n", *ptr); // 可能导致未定义行为  
        return 0;  
    }
}

变量a存储在栈内存,在getStackValue函数执行完以后,系统会自动回收a的这段内存。

解决方法避免返回指向栈内存的指针,或者确保在指针的生命周期内不会访问已经释放的栈内存。

相关推荐
数智工坊5 分钟前
【操作系统-文件管理】
数据结构·数据库
芒克芒克1 小时前
数组去重进阶:一次遍历实现最多保留指定个数重复元素(O(n)时间+O(1)空间)
数据结构·算法
星火开发设计1 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
夜勤月1 小时前
彻底终结内存泄漏与悬挂指针:深度实战 C++ 智能指针底层原理与自定义内存池,打造稳如泰山的系统基石
开发语言·c++
颜子鱼2 小时前
Linux驱动-INPUT子系统
linux·c语言·驱动开发
Fcy6482 小时前
⽤哈希表封装unordered_map和unordered_set(C++模拟实现)
数据结构·c++·散列表
CSDN_RTKLIB2 小时前
右值引用一个误区
c++
一分之二~2 小时前
二叉树--层序遍历(迭代和递归)
数据结构·c++·算法·leetcode
zhooyu3 小时前
OpenGL 与 C++:深入理解与实现 Transform 组件
开发语言·c++
东方轧线3 小时前
突破锁竞争的性能枷锁:深度剖析 C++ 内存模型与无锁编程在超大规模并行 AI 系统中的极致应用实践
java·c++·人工智能