IT技术博客大学习 共学习 共进步

标签:Pointers

共 3 篇相关文章

IT 累计浏览 13,162

Linus:利用二级指针删除单向链表

这篇讲的是Linus Torvalds如何用二级指针来优雅地删除单向链表节点。文章从Linus在slashdot上对一段“标准”代码的批评切入,他直言那种需要维护`prev`指针并判断是否为表头的写法,表明作者“不懂指针”。 核心对比了两种实现思路。传统写法(很多教科书和面试题的标准答案)需要额外维护一个`prev`指针,并在删除时判断当前节点是否为链表头,代码中存在条件分支。而Linus推崇的“core low-level coding”技巧,是直接使用一个指向节点指针的指针(即二级指针`node** curr`)来遍历和操作链表。其精妙之处在于,无论要删除的是表头还是中间节点,都可以通过统一的`*curr = entry->next`操作完成,无需任何条件判断。文章通过逐行代码解析和示意图,阐明了这种写法如何将“前驱指针”的概念融入到对`next`指针本身的间接操作中,最终生成更清晰、更可能被编译器优化出高效指令的代码。 这种对指针的深刻理解和运用,体现了Linus所看重的注重细节、追求高效底层编码的审美。

IT 累计浏览 3,401

在函数外存取局部变量的一个比喻

这篇讲的是C/C++中一个经典又容易踩坑的问题:为什么函数返回的局部变量地址会失效? 作者从StackOverflow上一段试图在函数外通过指针访问局部变量的代码出发,指出这种操作实际上触发了“未定义行为”。有趣的是,他没有直接罗列内存栈帧、作用域规则这些概念,而是用了一个巧妙的比喻:把函数的栈帧想象成一个“临时便签纸”。函数运行时,就在纸上写下局部变量的值;函数返回后,这张“纸”就被系统收回了,但指针p还傻傻地指着那张已经被擦除或准备覆盖的旧便签。所以通过p去读写,结果完全不可预测。 这种比喻把抽象的内存管理机制,变成了直观的生活经验。文章最终揭示的核心是:在栈上分配的生命周期,严格受限于函数的执行过程。理解这一点,就能自然避免那些“看起来对,实则危险”的编码习惯。

IT 累计浏览 2,541

Go 语言初学实践(2)

这篇讲的是Go语言初学实践系列的第二部分,作者从第一部分的基础知识延伸出来,聚焦于初学者在编写并发程序时最常遇到的几个坑点。具体来说,文章深入分析了goroutine和channel的误用场景,比如无意中创建的资源泄漏,以及如何通过context来优雅地控制并发任务的生命周期。作者通过实际代码示例,展示了竞态条件是如何产生的,并给出了使用go race detector工具进行检测和修复的步骤。此外,文中还对比了两种常见的错误处理模式——显式检查与panic/recover,指出在生产代码中应优先使用前者以提高可维护性。整个讲解过程结合了作者自己的调试经验,比如在处理HTTP请求超时时,如何避免goroutine堆积导致的内存问题。最后,文章总结了这些实践对提升Go程序健壮性的具体帮助,让初学者能更自信地进入并发编程的世界。