链表污染或节点劫持
一、场景模拟1. 当前我有两个结构体一个用来存储节点另一个用来存储符合条件内容的节点。typedef struct TempNode { book_n *book_ptr; // 指向原始图书节点的指针 struct TempNode *next; } TempNode; // 临时链表头 typedef struct { TempNode *head; int count; } TempList; // 函数 TempList* filter_by_one_condition(TempList *input_list, SearchCondition *search); // 参数1TempList *input_list; // 输入链表要遍历的链表 // 参数2SearchCondition *search; // 查找条件 // TempList *new_list; // 返回的符合条件的新链表2. 假设输入的链表 input_list 中有三本书分别是 A、B、C其中符合条件的书是 A 和 C我们需要把 A 和 C 放到 new_list 节点中。二、代码逻辑1. 遍历 input_list 节点找到符合的节点 A、C。2. 创建 new_list 节点将节点 A 和 C 分别插入到 new_list 节点中。3. 返回新创建的 new_list 节点。// 错误写法 // curr_temp 是遍历节点 if (is_match) { // 符合条件 if (new_list-head NULL) { new_list-head curr_temp; // 直接把输入链表的节点 A 拿过来当头 tail curr_temp; } else { tail-next curr_temp; // 【致命】修改了 A 的 next 指针让它指向 C tail curr_temp; } }三、步骤模拟第一步处理节点 A匹配1.curr_temp指向A。2.new_list为空。3.new_list-head A。4.tail A。此时内存状态输入链表视角A - B - C还没变因为没动A-next结果链表视角Head - A第二步处理节点 B不匹配1.curr_temp指向B。2.is_match为假跳过不做任何操作。3. 循环继续curr_temp变为C。输入链表A - B - C结果链表Head - ATail 还是 A第三步处理节点 C匹配—— 灾难发生时刻1.curr_temp指向C。2.is_match为真。3. 此时tail是A。此时会把 A 的 next 指针强行改成指向 C如果没有其他指针指向 BB 就变成了孤儿节点内存泄漏。如果你后续还要遍历输入链表比如curr_temp curr_temp-next你会直接从 A 跳到 C永远漏掉 B 之后的所有节点如果 B 后面还有 D、E... 它们也全丢了。此时的内存状态[ Node A ] ──next──→ [ Node C ] ---------- ---------- | data: A | | data: C | | next: |──┐ | next: |──→ NULL (假设 C 原来是尾节点) ---------- │ ---------- └──────→ (原本指向 B现在被强制改向 C) [ Node B ] ── ️ 孤儿节点没人指向它了内存泄漏 ---------- | data: B | | next: |──→ ... ----------第四步潜在的崩溃如果 C 不是最后一个假设输入链表是A - B - C - D。C 匹配D 不匹配。1、执行tail-next C即A-next C。2、tail更新为C。3、循环结束。结果链表Head - A - C。但是在输入链表中C-next指向D。因为你没有创建新节点也没有把C-next设为NULL结果链表的尾部依然挂着 D当你遍历结果链表打印时打印 A。顺着A-next找到 C。打印 C。顺着C-next找到D。打印 D哪怕 D 根本不匹配条件结果污染结果链表里混入了不匹配的节点因为它们的next指针还连着原链表的后续部分。正确做法/* 输入链表完好无损[A] - [B] - [C] - [D] 结果链表独立新建[New_A] - [New_C] | | v v 指向A 指向C New_A-next 指向 New_C New_C-next 是 NULL 原链表 A-next 依然指向 B不受影响。 */ // 代码部分 while (curr_temp ! NULL) { // ... 判断 is_match ... if (is_match) { // 【关键步骤】为当前匹配的书申请一块新的内存空间 TempNode *new_node (TempNode *)malloc(sizeof(TempNode)); // 填充这个新节点 new_node-gt;book_ptr curr_temp-gt;book_ptr; // 指向真正的书 new_node-gt;next NULL; // 初始化 next // 链接到结果链表 if (new_list-gt;head NULL) { new_list-gt;head new_node; tail new_node; } else { tail-gt;next new_node; tail new_node; } new_list-gt;count; } curr_temp curr_temp-gt;next; // 继续检查下一本输入链表中的书 }四、总结1、破坏性修改直接复用节点意味着你要修改它的next指针来构建新链表。这会切断它在原链表中的连接导致原链表遍历中断或数据丢失。2、尾部污染除非你手动把最后一个匹配节点的next设为NULL否则结果链表会一直延伸到原链表的末尾包含大量不匹配的数据。3、为了避免链表污染新链表一定要malloc节点。

相关新闻

深入解析TI MSPM0 UNICOMM模块:统一串行通信外设的架构与实战

深入解析TI MSPM0 UNICOMM模块:统一串行通信外设的架构与实战

1. 项目概述:理解UNICOMM模块的设计哲学在嵌入式开发领域,尤其是面对资源受限的微控制器(MCU)时,一个经典的设计难题是:如何在有限的芯片面积和引脚资源内,为开发者提供尽可能丰富和灵活的通信接…

2026/10/20 4:29:26 阅读更多 →
基于协同过滤的电影推荐系统开发实践

基于协同过滤的电影推荐系统开发实践

1. 项目概述:基于协同过滤的热门电影推荐系统这个项目构建了一个完整的影视推荐平台,采用DjangoVue3前后端分离架构,核心功能是通过协同过滤算法实现个性化电影推荐。系统会分析用户历史行为数据(如评分、收藏、浏览时长&#xff…

2026/10/20 14:20:53 阅读更多 →
企业内网单域环境搭建与Active Directory部署指南

企业内网单域环境搭建与Active Directory部署指南

1. 项目概述在企业IT基础架构建设中,内网域环境的搭建是构建统一身份认证和集中管理的基础工程。单域搭建作为最基础的Active Directory部署方案,特别适合中小型组织或分支机构使用。我曾在多个200-500人规模的企业中实施过此类项目,发现合理…

2026/10/19 2:17:40 阅读更多 →

最新新闻

欧拉20 SP8上GaussDB 100部署实战:从环境准备到避坑指南

欧拉20 SP8上GaussDB 100部署实战:从环境准备到避坑指南

简介:这是面向 GaussDB 100 数据库管理员与运维工程师的部署资源,基于 EulerOS 20 SP8 64 位环境,用于快速完成分布式数据库的安装、升级或版本验证,可减少手动配置带来的时间消耗。压缩包体积约 7.39MB,共 6 个文件&a…

2026/10/21 3:10:09 阅读更多 →
OpenCV实战:多方向箭头识别与模板匹配优化

OpenCV实战:多方向箭头识别与模板匹配优化

“OpenCV 项目实战:多方向箭头识别与模板匹配优化”这个标题里的每一个词,都是我踩过坑之后才真正理解的。接到需求时,我原以为多方向箭头识别只是模板匹配的入门级应用,做起来才发现,光是把“多方向”三个字落地&…

2026/10/21 3:10:09 阅读更多 →
VXLAN分布式网关实验详解:从原理到配置排错

VXLAN分布式网关实验详解:从原理到配置排错

1. 为什么全网都在聊VXLAN,以及分布式网关到底解决了什么先聊点实际的。如果你最近在搞数据中心网络、虚拟化迁移或者跨机房容器网络,一定绕不开VXLAN这个词。我去年的某个项目里,客户要求把两个物理机房的虚拟机网络打通,业务侧要…

2026/10/21 3:10:09 阅读更多 →
OpenCV模板匹配实战:多方向箭头识别与旋转尺度优化指南

OpenCV模板匹配实战:多方向箭头识别与旋转尺度优化指南

最近在做一个视觉定位相关的项目,有一块需求是要从摄像头画面里识别出多方向箭头,并且输出箭头的具体朝向。最开始我觉得这个事不难,OpenCV 的模板匹配跑一版不就完了吗?结果一上手就发现,箭头只要转个方向&#xff0c…

2026/10/21 3:10:09 阅读更多 →
PWM调光LED从原理到实战:频率、占空比、驱动电路与避坑指南

PWM调光LED从原理到实战:频率、占空比、驱动电路与避坑指南

简介:一份以STC12C2052单片机为控制核心、利用脉宽调制(PWM)技术实现LED灯亮度无级调节的完整工程包,面向电子技术爱好者、嵌入式开发初学者及单片机课程实践者。包内涵盖LED显示、自动控制、键盘输入等多个独立功能模块&#xff…

2026/10/21 3:10:09 阅读更多 →
51单片机DS18B20温度采集与NRF905无线传输实战

51单片机DS18B20温度采集与NRF905无线传输实战

简介:这是一套面向单片机爱好者、电子类专业学生与DIY玩家的温度采集与无线传输实践方案,基于51单片机搭配NRF905无线模块,解决短距离温度数据采集与无线收发的问题,适合具备一定电子技术基础、能看懂基础电路图并了解C语言设计原…

2026/10/21 3:09:09 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →