C/C++学习笔记:内存分区

By AverageJoeWang
 标签:

一.引子

写代码的时候总是十分困惑,都是在一个程序,各种类型的内容都存储在不一样的地方,叫法也不同,从而决定了他们的性质,操作等。本篇笔记是基于网上查找的资料和书籍做的一篇笔记。

二.内存分区

内存一共分为五大区域。分别是堆,栈,全局(静态)存储区,文字常量区,代码程序区。

2.1.堆

  • 由程序员手动分配和释放,与数据结构中的堆不同
  • 分配方式类似链表
  • 由malloc或者new来分配,free和delete来释放
  • 若程序员不释放,程序结束时由系统释放

2.2.栈

  • 由编译器自动分配和释放
  • 存放函数的参数值,局部变量的值等
  • 操作方式类似于数据结构中的栈

2.3.全局(静态)存储区

  • 存放全局变量和静态变量
  • 包括全局初始化区(DATA段)与全局未初始化区(BSS段)
  • 初始化的全局变量和静态变量存放在DATA段
  • 未初始化的全局变量和未初始化的静态变量存放在BSS段
  • 程序结束后由系统释放

2.4.文字常量区

  • 存放常量字符串
  • 程序结束后由系统释放

2.5.程序代码区

  • 存放函数体的二进制代码

2.6.例子

int k = 1;//全局变量,存储在全局存储区
void main()
{
    int i = 1;//栈
    char *j;//j在堆区上
    static int m = 1;//静态变量区
    char *n = "hello";
    /*n在栈上,内容为一段地址,指向位于文字常量区的"hello",此时"hello"只有一份拷贝*/
    char a[] = "world";
    /*a位于栈上的6个元素(含字符串末尾的空字符)的数组,并将"world"拷贝到它所占的内存中,此时"world"有2份拷贝*/
}