news 2026/7/7 5:15:31

为什么野指针这么危险?C语言最隐蔽的崩溃元凶,一文彻底搞懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么野指针这么危险?C语言最隐蔽的崩溃元凶,一文彻底搞懂

为什么野指针这么危险?C语言最隐蔽的崩溃元凶,一文彻底搞懂

你有没有遇到过这种情况?

#include<stdio.h>intmain(){int*p;// 声明了指针,但没初始化*p=100;// ❌ 直接往未知地址写数据printf("%d\n",*p);return0;}

运行结果?不一定是报错,而是——

(有时候崩溃) (有时候正常输出 100) (有时候输出莫名其妙的数字) (有时候电脑直接蓝屏)

这种"时好时坏"的 bug,就是野指针的典型症状。今天 5 分钟,把它彻底搞明白。


一句话结论:野指针就是指向了「不该去的地方」的指针

正常的指针指向你申请好的合法内存(变量、数组、malloc 分配的空间)。

野指针指向的是随机的、被释放的、或者根本不属于你的内存地址。往里面写数据,就像随机往别人家里扔东西——可能砸到空气,也可能砸到人。


画个图就清楚了

正常指针: ┌──────────┐ ┌─────┐ │ ptr=0x1000 │ ──▶ │ 100 │ 合法内存 └──────────┘ └─────┘ 野指针(未初始化): ┌──────────┐ ┌─────┐ │ ptr=0xF38B │ ──▶ │ ??? │ 操作系统保护区 / 其他程序 / 随机垃圾 └──────────┘ └─────┘ ↑ 段错误 (Segmentation Fault) 或者: 默默破坏了别人的数据!

野指针的三种常见来源

来源一:指针未初始化

int*p;// p 的值是栈上的随机垃圾值*p=10;// 往随机地址写入 → 崩溃或数据损坏

正确做法:

int*p=NULL;// 要么初始化为 NULLinta=10;int*p=&a;// 要么指向合法地址int*p=malloc(sizeof(int));// 要么分配堆内存

来源二:free 之后继续用(悬空指针)

int*p=malloc(sizeof(int));*p=42;free(p);// 内存还给了系统*p=100;// ❌ 危险!p 现在是野指针

释放后的内存可能被系统重新分配给其他变量。你往里面写数据,相当于随机覆盖别人的数据。

正确做法:

free(p);p=NULL;// 释放后立即置空,防止误用

来源三:返回了局部变量的地址

int*getNumber(){intn=42;return&n;// ❌ n 在栈上,函数返回后内存就释放了}intmain(){int*p=getNumber();printf("%d\n",*p);// 可能输出 42,也可能输出垃圾return0;}

函数返回后,局部变量n的栈内存已被回收。指针 p 指向的地址"看起来还能用",但实际上随时可能被覆盖。


为什么有时候不崩溃?

这是野指针最阴险的地方——它不一定会立即报错

情况1:野指针指向了操作系统保护区 → 段错误,程序崩溃(运气好) 情况2:野指针指向了你自己程序的合法区域 → 悄悄覆盖了某个变量的值(灾难!) 情况3:野指针指向了未使用的内存 → 看起来"正常工作"(埋下定时炸弹)

情况 2 是最可怕的——程序继续运行,但某个变量的值被莫名其妙修改了。你排查了几个小时,最后发现是一个已经被 free 的指针在背后作祟。


怎么防范?

措施说明
声明时初始化int *p = NULL;永远不要裸声明
free 后置 NULLfree(p); p = NULL;成对操作
不返回局部变量地址需要返回指针时用mallocstatic
使用前判空if (p != NULL) { ... }
用工具检测Valgrind、AddressSanitizer(ASan)能自动检测野指针

记住一句话

野指针的可怕不在于它一定会崩溃,而在于它不知道什么时候崩溃。未初始化和释放后忘置空是两大元凶,记住了就能避开 90% 的坑。

你被野指针坑过吗?评论区说说你的惨痛经历。

#c语言 #算法 #数据结构

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 5:14:54

Audacity音频编辑全攻略:从零开始掌握专业音频处理技巧

Audacity音频编辑全攻略&#xff1a;从零开始掌握专业音频处理技巧 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想要免费获得专业级的音频编辑能力吗&#xff1f;Audacity这款完全开源、跨平台的音频编辑神器&…

作者头像 李华
网站建设 2026/7/7 5:13:09

LRCGET:如何为本地音乐库一键下载同步歌词的终极指南

LRCGET&#xff1a;如何为本地音乐库一键下载同步歌词的终极指南 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 还在为本地音乐缺少歌词而烦恼吗&…

作者头像 李华
网站建设 2026/7/7 5:12:02

DC-9靶场渗透实战:从SQL注入到端口敲门绕过防火墙

1. 项目概述&#xff1a;一次完整的渗透测试实战复盘最近在复现一个经典的渗透测试靶场——DC-9。这个靶机很有意思&#xff0c;它不像一些“直给”的靶机&#xff0c;把漏洞直接摆在你面前&#xff0c;而是模拟了一个相对真实的、有防护措施的环境。整个渗透路径从Web应用的SQ…

作者头像 李华
网站建设 2026/7/7 5:02:38

国产振动测试 “香饽饽”|GB/T 4857.23-2021附录D为啥人人都爱用

先搞懂&#xff1a;GB/T 4857.23 到底是什么&#xff1f;GB/T 4857.23-2021 全称《包装 运输包装件基本试验 第 23 部分&#xff1a;垂直随机振动试验方法》&#xff0c;是国内运输包装振动测试的现行国标&#xff0c;2022 年 5 月正式实施。它专门模拟货车、火车运输时无规律的…

作者头像 李华