对于那些具有高级编程语言诸如: Ruby、Scheme、Haskell 等背景的人来说,学习 C 语言是具有挑战性的。除了纠结于 C  语言中像手动内存管理和指针等底层特性外,你必须在没有 REPL ( Read-Eval-Print Loop ) 的条件下完成工作。一旦你已经习惯于在 REPL 环境下进行探索性的编程,必须进行“编写-编译-运行”这样循环实在有点令人生厌。
  近我发现其实可以用 GDB 来作为 C 语言的伪 REPL。我一直尝试使用 GDB 作为学习 C 语言的工具,而不仅仅是用来调试 C 程序,事实上这非常有趣。
  这篇文章我的目的是向你展示 GDB 是一个非常好的学习 C 语言工具。下面我将会向你介绍一些我喜欢的 GDB 命令,然后我会向你阐述怎样使用 GDB 来理解 C 语言中一个出了名的复杂问题:数组和指针的区别。
  GDB 简介
  从创建一个简单的 C 程序开始,minimal.c:
  int main()
  {
  int i = 1337;
  return 0;
  }
  注意这个程序并没有做任何事情,也没有一条输出指令。拥抱使用 GDB 学习 C 语言的美丽新世界吧!
  使用 -g 参数进行编译,这样会生成一些有助于 debug,gdb 可以利用的信息,编译后用 GDB 运行起来:
  $ gcc -g minimal.c -o minimal
  $ gdb minimal
  你现在应该能看到明显的 GDB 提示行。我之前告诉你这是一个 REPL,下面我们来试试:
  (gdb) print 1 + 2
  $1 = 3
  多么神奇! print 是 GDB 的内置命令,他能够打印出一个 C 语言命令的返回值。如果你不确定一个 GDB 命令是做什么,尝试在 GDB 提示下运行命令 help。
  然后是一个更有趣的例子:
  (gbd) print (int) 2147483648
  $2 = -2147483648
  这里我先忽略为什么 2147483648 == -2147483648;我想要说明的是即使是算术运算在 C 语言中也是有很多坑的,GDB 能够理解运行 C 语言中的算术运算。
  现在让我们在主函数中设置一个断点然后运行程序:
  (gdb) break main
  (gdb) run
  现在程序在第 3 行处暂停,正好在 i 进行初始化之前。有趣的是,尽管 i 还没有被初始化,我们依然能够使用 print 命令看到它的值。
  (gdb) print i
  $3 = 32767
  在 C 语言中,一个未被初始化的局部变量的值是没有定义的,所以你用 GDB 打印出的值可能与这里的不一样。
  我们可以用 next 命令来执行当前断点这一行:
  (gdb) next
  (gdb) print i
  $4 = 1337
  使用 x 命令检查内存
  在 C 语言中变量用来标示一块连续的内存区间。一个变量的内存区间由两个数字决定:
  这块内存第一个字节数的数值地址
  内存的大小,单位是字节。变量所占内容的大小取决于变量的类型。
  C 语言中一个独特的特性是你能够直接访问变量所占的内存。操作符 & 可以计算一个变量的地址,操作符 sizeof 计算变量所占内存的大小。
  你可以在 GDB 中测试以上两个概念:
  (gdb) print &i
  $5 = (int *) 0x7fff5fbff584
  (gdb) print sizeof(i)
  $6 = 4
  字面上看,i 所占内存起始于地址 0x7fff5fbff5b4,占内存 4 个字节。
  我前面提到的变量在内存中的大小取决于它的类型,所以操作符 sizeof 能够直接作用于类型:
  (gdb) print sizeof(int)
  $7 = 4
  (gdb) print sizeof(double)
  $8 = 8
  以上显示意味着,至少在我的计算机上 int 变量占 4 个字节空间,double 变量占 8 个字节。