<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>C 语言 on 栈外随记</title>
    <link>https://btio.cn/tags/c-%E8%AF%AD%E8%A8%80/</link>
    <description>Recent content in C 语言 on 栈外随记</description>
    <image>
      <title>栈外随记</title>
      <url>https://btio.cn/images/logo-arong.svg</url>
      <link>https://btio.cn/images/logo-arong.svg</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-CN</language><lastBuildDate>Mon, 03 Aug 2026 16:29:04 +0800</lastBuildDate>
    <atom:link href="https://btio.cn/tags/c-%E8%AF%AD%E8%A8%80/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>做耳机开发，需要掌握哪些 C 语言知识</title>
      <link>https://btio.cn/posts/2026/08/03/%E5%81%9A%E8%80%B3%E6%9C%BA%E5%BC%80%E5%8F%91%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E5%93%AA%E4%BA%9B-c-%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86/</link>
      <pubDate>Mon, 03 Aug 2026 16:29:04 +0800</pubDate>
      <guid>https://btio.cn/posts/2026/08/03/%E5%81%9A%E8%80%B3%E6%9C%BA%E5%BC%80%E5%8F%91%E9%9C%80%E8%A6%81%E6%8E%8C%E6%8F%A1%E5%93%AA%E4%BA%9B-c-%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86/</guid>
      <description>&lt;p&gt;TWS 应用层的大部分工作，最后还是要落到 C 代码上。这篇整理开发中经常用到、也容易混淆的内容，方便需要时快速回顾。&lt;/p&gt;
&lt;h2 id=&#34;section-1&#34;&gt;一、数据类型与类型转换&lt;/h2&gt;
&lt;p&gt;嵌入式代码经常使用 &lt;code&gt;uint8_t&lt;/code&gt;、&lt;code&gt;uint16_t&lt;/code&gt; 和 &lt;code&gt;uint32_t&lt;/code&gt;，因为它们的位宽是明确的。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;int&lt;/code&gt; 占多少字节，由芯片架构和编译器决定。在常见的 32 位平台上，&lt;code&gt;int&lt;/code&gt; 通常占 4 字节；在部分嵌入式平台上，也可能只占 2 字节。可以使用 &lt;code&gt;sizeof&lt;/code&gt; 查看当前平台上的实际大小：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;int size: %u&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;sizeof&lt;/code&gt; 返回的是 &lt;code&gt;size_t&lt;/code&gt; 类型。这里先把结果转换成 &lt;code&gt;unsigned int&lt;/code&gt;，再使用 &lt;code&gt;%u&lt;/code&gt; 输出，适合常见的嵌入式 &lt;code&gt;printf&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;普通计算和循环计数可以使用 &lt;code&gt;int&lt;/code&gt;。通信协议、Flash 数据、文件格式和寄存器字段需要明确长度时，优先使用固定位宽类型。&lt;/p&gt;
&lt;p&gt;类型转换主要注意下面几种情况：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;情况&lt;/th&gt;
					&lt;th&gt;需要注意什么&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;大类型转小类型&lt;/td&gt;
					&lt;td&gt;高位可能被截断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;有符号转无符号&lt;/td&gt;
					&lt;td&gt;负数会变成很大的正数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;无符号与有符号比较&lt;/td&gt;
					&lt;td&gt;有符号数可能先被转成无符号数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;指针类型转换&lt;/td&gt;
					&lt;td&gt;只改变读取内存的方式，不会改变原来的数据&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：有符号数和无符号数比较前，尽量把两边统一成合适的类型。进行指针类型转换时，要确认原内存长度不小于目标类型的大小。例如原数据只有 1 字节，转换成 &lt;code&gt;uint32_t *&lt;/code&gt; 后却按照 4 字节读取，就会读到不属于它的内存。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;section-2&#34;&gt;二、指针、数组与生命周期&lt;/h2&gt;
&lt;p&gt;指针保存的是地址。使用前主要检查四件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指针是否为空。&lt;/li&gt;
&lt;li&gt;指向的内存是否仍然有效。&lt;/li&gt;
&lt;li&gt;访问长度是否越界。&lt;/li&gt;
&lt;li&gt;指针指向的数据类型是否正确。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;update_state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint8_t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数组传入函数后通常会退化成指针，函数内部无法再通过 &lt;code&gt;sizeof&lt;/code&gt; 得到原数组长度。因此传递缓冲区时，最好同时传入长度。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
