<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rust on TouchingFish.top</title><link>https://touchingfish.top/tags/rust/</link><description>Recent content in Rust on TouchingFish.top</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 19 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://touchingfish.top/tags/rust/index.xml" rel="self" type="application/rss+xml"/><item><title>Rust 的"解法"</title><link>https://touchingfish.top/2025/learning-rust-c-memory-safety/</link><pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate><guid>https://touchingfish.top/2025/learning-rust-c-memory-safety/</guid><description>&lt;p&gt;翻出 2020 年写的 C 语言博客。&lt;/p&gt;
&lt;p&gt;&lt;a href="../../2020/array-and-pointer/"&gt;数组与指针&lt;/a&gt;，&lt;a href="../../2020/journey-to-c-language/"&gt;内存布局与调试&lt;/a&gt;。那时候写得挺认真的，后来还画内存图，标注高地址低地址，解释为什么 &lt;code&gt;arr[3] = 20&lt;/code&gt; 能把旁边变量 &lt;code&gt;i&lt;/code&gt; 的值也改了。文章结尾写的是：&amp;ldquo;为避免这种错误，始终要确保在使用数组时不越界访问。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;现在回头看，那句话翻译成人话大概是：你最好别写错。&lt;/p&gt;
&lt;p&gt;因为写错了编译器不会告诉你。&lt;/p&gt;
&lt;p&gt;学 Rust 的时候，很多东西越看越像是对 C 里那些经典问题的系统性回应。不是&amp;quot;Rust 比 C 好&amp;quot;——是 Rust 把二十年来系统编程中最常见的错误模式，逐个编码进了编译器和类型系统里。一个 Rust 新手在编译期被挡下的问题，可能比一个 C 老手十年遇到的运行时 bug 还全面。&lt;/p&gt;
&lt;h2 id="指针三兄弟"&gt;指针三兄弟&lt;/h2&gt;
&lt;p&gt;NULL、野的、悬空——C 程序员的日常恐惧来源。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;int *p = NULL; *p = 1;&lt;/code&gt; 编译通过。运行到这一行，操作系统发来 SIGSEGV。不是编译期能发现的事——NULL 是一个合法的指针值，只是指向的地址不可访问。编译器没有语义层面的&amp;quot;这个指针可能为空&amp;quot;的概念。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;int* f() { int x = 5; return &amp;amp;x; }&lt;/code&gt; 也编译通过。x 在 f 的栈帧里，函数返回后栈帧被回收，返回的地址指向一块随时可能被覆盖的内存。这个地址仍然&amp;quot;合法&amp;quot;——它在一个可访问的内存段内，只是内容不受你控制。有时候打印出 5，有时候打印出随机数，有时候什么都没发生，取决于后续函数调用有没有踩到同一块栈空间。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;free(p); *p = 1;&lt;/code&gt; 还是编译通过。free 之后那块堆内存被标记为可用，但 p 的值没变，仍然指向原地址。继续通过 p 读写，运气好时数据还没被覆盖，程序照常运行——这比直接崩溃更危险，因为你不知道错误已经埋下了。&lt;/p&gt;
&lt;p&gt;Rust 的做法很简单：没有 NULL。没有悬垂引用。没有 use-after-free。&lt;/p&gt;</description></item></channel></rss>