网上找了一堆资料学习一下,了解这些,

有助于规化程序结构,优化代码;

使用gcc编译出来的程序,用size可以查看程序结构和大小,

#size hello
Text data bss dec hex filename
778  200  4   982 3D6 hello

所以一个可执行的程序文件,结构分三部分:

.text 代码段,用来存放代码,一般是只读的区域;

.data 数据段,用来存放全局初始化变量,常量,以及全局或局部静态变量,只初始化一次;

.bss BSS段,用来存放全局未初化数据,用0初始化;

那有人问非全局变量放哪里了?

还有常说的堆和栈呢?

程序在执行时,会产生临时变量或是函数返回值,

还有函数中动态分配的地址空间,如malloc, new等…

根据这些需求,才需要堆和栈的出现,

所以堆(heap)和栈(Stack)这两个段是在程序运行时才有.

.stack 栈区,用来存放局部变量,函数的参数,返回值等,由编译器自动分配释放;

栈的概念来自数据结构,栈只能在一端操作,所以先入栈的后出,“先进后出”,这种结构保护之前的现场,

如一个函数被调用后,产生的临时变量都会存到栈区的顶部,当函数完成后,会自动从顶部将刚使用的数据销毁;

另外栈区的地址是从高地址向下增长的;

.heap 堆区,用来动态内存分配,如malloc, new申请的内存,由程序员分配释放;