内存类型

运行一个 C 程序的时候, 会分配两种类型的内存:

  • 栈内存, 其申请和释放由编译器隐式管理, 也被称为自动内存.
  • 堆内存, 其申请和释放由程序员显式地完成.
void func() {
  int a; // Declares an integer on the stack
  int *p = (int *)malloc(sizeof(int)); // Declares a pointer on the stack, then assigns memory on the heap
}

C 语言库调用

  • malloc()
  • free()

底层操作系统支持

上述的 C 语言库函数调用是建立在一些系统调用之上的, 程序通过系统调用进入内核态, 从而分配或释放内存.

一个这样的系统调用叫作 brk, 他用于改变程序分断(break)的位置, 即堆结束的位置.
其需要一个参数, 为新分断的地址, 根据与当前分断大小比较是增加或减小堆的大小.
另一个调用 sbrk 要求传入一个增量, 但是效果类似.

还可以通过 mmap() 调用从操作系统获取内存, 在程序中创建一个匿名内存区域,
不与任何文件相关联, 而是与交换空间关联, 可以像堆一样管理.