堆相对比较容易理解, 就是计算机剩余的内存, 可以通过 malloc 函数访问获取堆内存。 每次调用 malloc , 操作系统使用内部函数为你注册分配一块内存, 并返回指向它的指针。 当你使用完之后, 要用 free 函数将它返回给操作系统以便其它程序可以使用。 如果没有这么做的话, 将会导致你的程序出现内存泄漏。
栈是一个特殊的内存区域, 存储函数创建的本地变量。 它的工作原理是每个函数的参数被压入堆栈,并在函数内使用。 这是真正的栈道数据结构, 后进先出。 对于本地变量也是相同的。 栈的好处是简单, 当函数退出时, C 编译器将这些变量推出栈道进行清理。 这样可以简单的避免栈道上的变量有内存泄漏。
如果变量不是用 malloc 直接获取, 也不是在函数内通过 malloc 间接获取, 那么这个变量就是在栈上。
堆栈需要注意的三个问题
type * ptr // 定义一个名称为 ptr 的 type 类型的指针;
*prt // 指针 ptr 指向内容的值;
*(ptr + i) // 指针 (ptr + i) 指向内容的值
&thing // thing 的地址
type *ptr = &thing // 将名称为 ptr 的 type 类型的指针指向 thing 的地址
ptr++ //将 ptr 指向的地址加一位