【C语言干货】野指针

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是野指针?

野指针是指向"无效内存区域"的指针。这些指针可能指向:

  • 已经释放的内存

  • 未初始化的随机地址

  • 超出合法范围的地址

使用野指针就像在现实生活中使用一个错误的地址去寄信------你无法预测信会送到哪里,甚至可能造成严重的后果。

二、野指针的三大成因

1.指针未初始化

问题代码

c

复制

下载

复制代码
#include <stdio.h>

int main() {
    int *p;  // 未初始化的局部指针变量,值是随机的
    *p = 10; // 向未知内存写入数据,危险!
    return 0;
}

分析

  • 局部变量未初始化时,其值是随机的(栈上的垃圾值)

  • 这个随机值被当作内存地址使用

  • 对该地址的读写操作可能导致段错误(Segmentation Fault)或悄无声息地破坏其他数据

2.指针越界访问

复制代码
#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *p = arr;
    
    for(int i = 0; i <= 5; i++) {  // 故意越界
        *(p++) = i * 10;
    }
    
    return 0;
}

分析

  • 数组arr只有5个元素,有效索引是0-4

  • 循环访问了arr[5],这已经越界

  • 越界后p指向的内存可能属于其他变量或不可访问区域

  • 可能破坏栈上的其他数据(如返回地址),导致程序异常

3. 指针指向已释放的内存

复制代码
#include <stdio.h>
#include <stdlib.h>

int *create_array(int size) {
    int *arr = (int *)malloc(size * sizeof(int));
    for(int i = 0; i < size; i++) {
        arr[i] = i + 1;
    }
    return arr;
}

int main() {
    int *my_array = create_array(5);
    free(my_array);  // 内存已释放
    
    // 错误:使用已释放的内存
    printf("%d\n", my_array[2]);  
    
    return 0;
}

分析

  • free()释放了my_array指向的内存

  • 但my_array的值(地址)并未改变

  • 继续使用这个指针就是访问已释放的内存

  • 可能导致数据混乱、程序崩溃或安全漏洞


相关推荐
菜鸡nan2 分钟前
23th Day| 39.组合总和,40.组合总和II,131.分割回文串
算法·leetcode·职场和发展
冷月葬花~2 分钟前
day37 卡码网52. 携带研究材料 力扣518.零钱兑换II 力扣377. 组合总和 Ⅳ 卡码网57. 爬楼梯
算法
qq_513970446 分钟前
力扣 hot100 Day63
数据结构·算法·leetcode
FlechazoCLF14 分钟前
QT中使用OpenCV保姆级教程
开发语言·qt·opencv
lifallen18 分钟前
AbstractExecutorService:Java并发核心模板解析
java·开发语言·数据结构·算法
神器阿龙27 分钟前
排序算法-归并排序
数据结构·算法·排序算法
遇见尚硅谷27 分钟前
# C语言:20250730学习(二级指针)
c语言·学习·算法
Ashlee_code33 分钟前
北极圈金融科技革命:奥斯陆证券交易所的绿色跃迁之路 ——从Visma千倍增长到碳信用衍生品,解码挪威资本市场的技术重构
科技·算法·金融·重构·架构·系统架构·区块链
我是why的狗1 小时前
赵义弘-----补题报告
算法·排序算法
weixin_437499921 小时前
【PHP 构造函数与析构函数:从基础到高级的完整指南】
开发语言·php