<?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/C++ on 疯狂的键盘</title><link>https://jidzhang.github.io/categories/c/c++/</link><description>Recent content in C/C++ on 疯狂的键盘</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2015 00:00:00 +0000</lastBuildDate><atom:link href="https://jidzhang.github.io/categories/c/c++/index.xml" rel="self" type="application/rss+xml"/><item><title>解决 undefined reference to 'pthread_mutex_trylock'</title><link>https://jidzhang.github.io/posts/fix-undefined-reference-to-pthread_mutex_trylock/</link><pubDate>Thu, 30 Apr 2015 00:00:00 +0000</pubDate><guid>https://jidzhang.github.io/posts/fix-undefined-reference-to-pthread_mutex_trylock/</guid><description>&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;编译时出现 &lt;code&gt;undefined reference to 'pthread_mutex_trylock'&lt;/code&gt; 等 pthread 相关函数的链接错误。&lt;/p&gt;
&lt;h2 id="原因"&gt;原因&lt;/h2&gt;
&lt;p&gt;POSIX 线程库（pthread）默认不链接，需要手动指定。&lt;/p&gt;
&lt;h2 id="解决"&gt;解决&lt;/h2&gt;
&lt;p&gt;编译时添加 &lt;code&gt;-lpthread&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc main.c -o &lt;span class="nb"&gt;test&lt;/span&gt; -lpthread
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或在 Makefile 中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LDFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; -lpthread
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="推荐"&gt;推荐&lt;/h2&gt;
&lt;p&gt;GCC 4.2+ 支持更规范的写法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc main.c -o &lt;span class="nb"&gt;test&lt;/span&gt; -pthread
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-pthread&lt;/code&gt; 会同时添加编译和链接所需的标志（包括预处理器宏），比 &lt;code&gt;-lpthread&lt;/code&gt; 更完整。&lt;/p&gt;</description></item><item><title>什么是堆？什么是栈？C/C++ 程序员必须搞清楚的概念</title><link>https://jidzhang.github.io/posts/heap-or-stack/</link><pubDate>Tue, 21 Apr 2015 00:00:00 +0000</pubDate><guid>https://jidzhang.github.io/posts/heap-or-stack/</guid><description>&lt;p&gt;&amp;ldquo;堆&amp;quot;和&amp;quot;栈&amp;quot;在 C/C++ 中有两个不同层面的含义：&lt;strong&gt;数据结构&lt;/strong&gt;层面和&lt;strong&gt;系统内存管理&lt;/strong&gt;层面。初学者经常混淆，本文从两个角度分别说清楚。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一数据结构层面"&gt;一、数据结构层面&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;栈（Stack）&lt;/th&gt;
&lt;th&gt;堆（Heap）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;规则&lt;/td&gt;
&lt;td&gt;后进先出（LIFO）&lt;/td&gt;
&lt;td&gt;满足堆性质的完全二叉树（最大堆/最小堆）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;用途&lt;/td&gt;
&lt;td&gt;函数调用栈、表达式求值、DFS&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;td&gt;数组（通常）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这是数据结构课程中的概念，与内存管理无关。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二系统内存管理层面"&gt;二、系统内存管理层面&lt;/h2&gt;
&lt;p&gt;这是 C/C++ 编程中更常见的语境。&lt;/p&gt;
&lt;h3 id="程序的内存布局"&gt;程序的内存布局&lt;/h3&gt;
&lt;p&gt;一个 C/C++ 程序的内存分为以下区域：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;高地址
┌─────────────────┐
│ 栈区（stack） │ ← 向低地址增长
│ ↓ │
│ │
│ （空闲空间） │
│ │
│ ↑ │
│ 堆区（heap） │ ← 向高地址增长
├─────────────────┤
│ 全局/静态区 │ 全局变量、static 变量
├─────────────────┤
│ 常量区 │ 字符串常量、const 常量
├─────────────────┤
│ 代码区 │ 函数体的机器指令
└─────────────────┘
低地址
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="栈stack"&gt;栈（Stack）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;由系统自动管理&lt;/strong&gt;，用于存放函数参数、局部变量、返回地址等。&lt;/p&gt;</description></item></channel></rss>