用C语言解释野指针
1. 野指针是什么野指针Wild Pointer是指向未分配、已释放、无访问权限或作用域已销毁的内存区域的指针。对野指针进行解引用、读写操作属于 C 语言标准中的未定义行为轻则程序直接崩溃段错误 Segmentation Fault重则静默篡改内存数据、引发难以排查的逻辑错误甚至产生安全漏洞。2. 野指针的成因2.1 指针变量未初始化这是最基础的野指针场景只定义指针变量不显式赋值指针会携带栈内存中的随机垃圾值指向一个完全不确定的地址。#include stdio.h int main() { int *p; // 仅定义指针未初始化 *p 666; // 解引用野指针触发未定义行为 return 0; }原理说明 局部指针变量存储在栈区C 语言不会自动将栈变量初始化为NULL它的值是栈内存中残留的历史数据等价于指向一个随机内存地址。 这个地址大概率是程序无权访问的系统内存解引用时会直接触发段错误也有可能碰巧指向程序自身的合法内存导致数据被意外篡改形成极难排查的隐性 bug。2.2 堆内存释放后指针未置空悬空指针用free()释放堆内存后指针变量本身的值不会被修改仍然指向已经被操作系统回收的内存地址此时的指针也叫悬空指针是野指针最常见的一种。#include stdio.h #include stdlib.h int main() { int *p (int*)malloc(sizeof(int)); *p 100; free(p); // 释放堆内存归还使用权 // 此时 p 仍然指向原地址但内存已不属于程序 printf(%d\n, *p); // 错误访问已释放的内存 return 0; }原理说明free()的作用只是把堆内存的使用权归还给内存管理器它不会修改指针变量本身的值也不会清空原内存的数据。释放后的内存可能被保留、也可能被重新分配给其他地方再次读取可能读到残留的旧值假象也可能读到脏数据写入则可能破坏其他模块的数据。规范写法free之后必须立刻将指针置空free(p); p NULL;2.3 返回局部变量的地址栈内存销毁函数内部的局部变量存储在栈区函数执行结束后栈帧会被销毁局部变量的内存会被回收。如果函数返回局部变量的地址接收地址的指针就会变成野指针。#include stdio.h int* getValue() { int num 10; // 局部变量位于栈区 return num; // 返回局部变量的地址 } int main() { int *p getValue(); printf(%d\n, *p); // 第一次可能碰巧读到10但已属于未定义行为 printf(%d\n, *p); // 栈被后续操作覆盖后值会变成乱码 return 0; }原理说明 函数调用结束后对应的栈帧会被弹出栈num占用的内存会被后续的函数调用、局部变量覆盖。 第一次printf可能因为栈还没被覆盖碰巧读到原值但这完全是巧合不具备任何可靠性。只要后续有任何栈操作数据就会被污染。注意不能返回栈上普通局部变量的地址如果需要返回地址可使用static静态变量位于全局区生命周期伴随整个程序或使用malloc在堆上分配内2.4 指针运算越界指向非法内存对数组指针进行加减移动时如果指针超出了数组的合法边界指向了数组之外的未知内存此时指针就变成了野指针。#include stdio.h int main() { int arr[3] {1, 2, 3}; int *p arr; p 5; // 指针向后移动5个int位置远超数组范围 printf(%d\n, *p); // 访问数组外的未知内存野指针 return 0; }原理说明长度为n的数组合法可访问的指针范围是arr[0] ~ arr[n-1]C 语言允许指针指向数组末尾的下一个地址仅用于循环结束判断禁止解引用但绝不允许指向更远的位置越界后的指针可能指向栈上其他变量、栈保护区域甚至系统内存解引用后果完全不可控。2.5 多指针共享内存释放后未同步置空当多个指针指向同一块堆内存时如果只通过其中一个指针释放内存并置空其他指针仍然持有原地址依然是野指针。这也叫别名野指针是多模块共享内存时的高频坑。#include stdio.h #include stdlib.h int main() { int *p1 (int*)malloc(sizeof(int)); int *p2 p1; // p2 和 p1 指向同一块堆内存 free(p1); p1 NULL; // p1 已经置空但 p2 没有同步更新 *p2 20; // p2 仍是野指针修改已释放的内存 return 0; }原理说明 指针只是存储内存地址的变量p1 NULL只是修改了 p1 自身的值不会影响 p2。p2 仍然保存着已经被释放的内存地址访问它依然是非法的。2.6 非法强制类型转换整数转指针直接把一个整数强制转换为指针类型让指针指向该整数对应的内存地址。普通应用程序中这种地址几乎都是无权访问的从而形成野指针。#include stdio.h int main() { int *p (int*)0x12345678; // 强制将整数转为指针 printf(%d\n, *p); // 访问随机地址几乎必然崩溃 return 0; }原理说明 用户态程序的内存地址由操作系统分配和管理不能随意指定地址访问。 仅在嵌入式开发、操作系统内核开发等特殊场景下才会操作固定的硬件寄存器地址普通应用程序中这种写法属于典型错误。3. 野指针的规避原则初始化必赋值定义指针时如果暂时不用一律初始化为NULL释放后置空free/fclose等释放资源后立刻将对应指针置为NULL不返回栈地址绝不返回函数内部普通局部变量的地址边界检查指针运算、数组访问时严格校验边界避免越界同步管理多指针共享同一块内存时确保内存释放后所有相关指针同步更新解引用前判空对指针解引用前先判断是否为NULL提前拦截无效访问。

相关新闻

天地一体化空间智控基座 平流层飞艇无感定位军营安防平台

天地一体化空间智控基座 平流层飞艇无感定位军营安防平台

一、方案总纲本平台由镜像视界浙江科技有限公司全栈自研打造,核心攻关内容纳入国家十四五重点课题研究序列,依托镜像视界浙江普陀时空大数据应用技术联合研究院完成平流层浮空感知、纯视觉无感定位、全域视频孪生成套技术迭代,全系统通过河南…

2026/6/27 3:04:22阅读更多 →
读信息安全专业考研还是直接就业更划算

读信息安全专业考研还是直接就业更划算

高考志愿填报时,信息安全专业越来越受到考生关注。但很多人在选择这个专业后,会面临一个很实际的问题:本科毕业直接找工作,还是继续读研深造?这个问题没有标准答案,不同选择对应完全不同的发展路径。想清楚…

2026/6/27 3:04:22阅读更多 →
青岛小程序开发公司推荐:九尾狐9大核心优势助力企业数字化升级

青岛小程序开发公司推荐:九尾狐9大核心优势助力企业数字化升级

在青岛,企业做小程序开发时最怕三件事:开发完源码拿不到、功能上线后无法扩展、后期出了问题找不到人维护。青岛九尾狐网络科技有限公司作为青岛本地专业的技术服务商,经过十余年发展沉淀了9大核心优势。优势一:十余年持续深耕。九…

2026/6/27 2:59:22阅读更多 →
零基础怎么做AI数据标注?我的入门实践记录

零基础怎么做AI数据标注?我的入门实践记录

声明:本文为通用技术分析,基于行业公开信息进行逻辑推演,不针对任何特定平台,不构成使用推荐。一、任务建模与分发策略AI数据标注平台的核心是将企业需求的标准数据拆解为标准化单元,分发给标注人员完成。一个标注任务…

2026/6/27 4:24:26阅读更多 →
表压缩新功能 compress for oltp ROW STORE COMPRESS ADVANCED ONLINE

表压缩新功能 compress for oltp ROW STORE COMPRESS ADVANCED ONLINE

ALTER TABLE ... COMPRESS FOR OLTP 对已有分区无效,因仅设置元数据标记而不重写物理块;压缩已有数据须用 MOVE PARTITION ... ROW STORE COMPRESS ADVANCED ONLINE 并重建索引。不能直接用 alter table ... compress for oltp 让已有分区数据变小——它…

2026/6/27 4:24:26阅读更多 →
用 responses-proxy 将 agnes-20-flash 接入原生 Codex:让免费 LLM 也能跑起来

用 responses-proxy 将 agnes-20-flash 接入原生 Codex:让免费 LLM 也能跑起来

最近在折腾原生 Codex 的模型接入时,遇到了一个比较典型的问题: 当前 Codex 主要支持 wire_api "responses" 模式,而很多第三方 OpenAI 兼容服务只提供 /v1/chat/completions 接口,无法直接接入。 其中,agn…

2026/6/27 4:24:26阅读更多 →
网络安全可以考什么证书?

网络安全可以考什么证书?

随着网络安全行业持续升温,越来越多人想进入这个领域。网络安全可以考什么证书?今天这篇文章一次性把国内外的重点网络安全证书讲清楚,帮你找到最适合自己的考证路线。一、为什么网络安全证书如此重要?网络安全行业拥有专业认证&a…

2026/6/27 4:24:26阅读更多 →
OpenClaw:自托管开源 AI 智能体网关,重新定义你的专属 AI 工作流

OpenClaw:自托管开源 AI 智能体网关,重新定义你的专属 AI 工作流

一、项目起源与核心定位OpenClaw 是 2025 年末诞生、2026 年正式定名的开源 AI 智能体网关项目,开发主体为 Peter Steinberger 团队,代码托管于 GitHub,采用宽松 MIT 开源协议,曾先后以 ClawdBot、Moltbot 为名迭代,最…

2026/6/27 4:24:26阅读更多 →
本地商户的获客指南,高德地图商户通到底能不能帮助本地商家获客当下本地实体行业竞争日趋激烈,餐饮、酒店、休闲娱乐、生活服务、汽修美容等各类线下商户,早已告别“坐等上门”的传统经营模式。多数中小本地商

本地商户的获客指南,高德地图商户通到底能不能帮助本地商家获客当下本地实体行业竞争日趋激烈,餐饮、酒店、休闲娱乐、生活服务、汽修美容等各类线下商户,早已告别“坐等上门”的传统经营模式。多数中小本地商

当下本地实体行业竞争日趋激烈,餐饮、酒店、休闲娱乐、生活服务、汽修美容等各类线下商户,早已告别“坐等上门”的传统经营模式。多数中小本地商户普遍面临两大核心难题:一是线下门店流量固定,自然到店客量增长乏力;二…

2026/6/27 4:19:26阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →