# 03 - Pointers and GDB

学习自主学习。自主阅读技术文档，很重要。

## 1. 指针 <a href="#tlje4" id="tlje4"></a>

swap函数引出指针的必要性。老生常谈了。指针传递并非传递副本。

#### 1.1. 指针作为函数参数 <a href="#njq9s" id="njq9s"></a>

当函数结束的时候，计算机会忘记当时因函数执行分配的内存是用来干嘛的了。这不意味着他会被赋予 NULL 值，或者用 0 值覆盖，又或者被清空。

#### 1.2. 指针传值 <a href="#lsmty" id="lsmty"></a>

指针...地址...指针...地址，初学者的噩梦。

## 2. the Greatest "BUG" <a href="#qmfa1" id="qmfa1"></a>

CS 世界 BUG 无处不在。我们不能避免，但我们可以为此做些预备。

* 栈错误。包括变量未初始化。计算机会遗忘内存的一些内容。需要时时刻刻下达对应指令。
* 内存泄漏

#### 2.1. GDB 调试 <a href="#mjjqu" id="mjjqu"></a>

通过 GDB 找出程序在哪一步开始不符合你的预期。

#### 2.2. 趁机学一下... <a href="#vjuoq" id="vjuoq"></a>

又是我的知识盲区。

## 3. 穿插 <a href="#ksjsx" id="ksjsx"></a>

#### 3.1. CS50 开源库 <a href="#nyimr" id="nyimr"></a>

C 语言的开源特性使得我们可以使用网上更新的动态函数库。

#### 3.2. `malloc` 动态内存分配 <a href="#bnafs" id="bnafs"></a>

要 Free，如果长久不 Free的话程序运行非常画满，效率变得底下。

#### 3.3. `relloc` <a href="#kds8l" id="kds8l"></a>

自动 Free

#### 3.4. 结构体 <a href="#kkrvu" id="kkrvu"></a>

一种包含好几种类型数据的类型...

讲的很细......每次都有结合和callback...遥遥领先某电专。

#### 3.5. 判断分支的布尔值 <a href="#xetvp" id="xetvp"></a>

可以与输入输出函数结合作为提升程序健壮性的工具。

#### 3.6. 文件输入输出 <a href="#rdbyc" id="rdbyc"></a>

`fprintf`将输出打到文件中，而不是屏幕上

`sscanf`等等一些基本的标准输入输出

#### 3.7. 交互设备 <a href="#ucajb" id="ucajb"></a>

键盘输入、屏幕输出、文件输入 & 输出
