为了弄清楚这个问题,先看看在C语言中变量的分类首先查看这篇文章。
一、linux的进程内存分布
1)主要是由从小到大的地址空间分布,从低地址到高地址依次是:文本段(text),数据段,BSS段,堆,栈。
- 文本段:文本段中存放的是代码,只读数据,字符串常量(我们通常说保存在文字常量中,实际就是在文本段)
- 数据段:数据段用来存放可执行文件中已经初始化的全局变量,全局变量又可细分为全局变量和程序分配的static静态变量
- BSS:BSS段包含了程序中未初始化的全局变量,在内存中全局变量全部初始化为0。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
- 堆(heap):堆主要用来存放进程中动态分配的内存段,其大小不固定,可动态扩张或缩减。当进程使用malloc等函数分配内存时,新分配的内存就被动态添加到堆上,相当于堆被扩张。当利用free等函数释放内存时,被释放的内存被从堆中剔除,相应于堆被缩减,堆的物理内存是由程序申请,并由程序释放。
- 栈:栈是用户程序存放临时空间的局部变量,也就是我们所说的{}中定义的变量(但不包括static声明的变量,static意味着变量被存储到数据段)。除此以外,在函数被调用时其参数也被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也被压入栈中,由于栈的先进后出原则,所以栈特别方便用来保存或恢复调用现场,从这个意义上讲,我们可以把堆栈看做一个寄存,交换临时数据的内存区。它是由操作系统分配的,内存的申请与回收都由OS管理。
- 常量存储区,和“全局/静态存储区”一样,通常是用于那些