代码区 数据区 堆区 栈区 先了解
- 代码区:编译期间确定,运行时只读,不可修改,(在运行期间修改是十分危险的行为)
- 数据区:也被称为全局存储区,主要存储全局变量和静态变量。编译期间大小确定,运行时可以读写。
- (1): 全局变量 :
- 函数外部定义的变量,它们在整个程序的生命周期内都是可见的,可以被程序中的所有函数访问。全局变量在程序启动时分配内存,在程序结束时释放内存。
- (2): 静态变量:
- 是在函数内部或者外部使用static关键字定义的变量,启动时分配内存,结束时释放内存,
- 作用域: 函数内部定义::函数内部访问
- 函数外部定义::任何函数内部访问
- 堆区:运行时动态分配,可读写。堆区的内存分配和释放由程序员手动控制,可能导致导致内存泄漏(堆向高地址生长)
- 栈区:栈区(Stack)编译器自动分配和释放的,存放函数的参数值、局部变量等。
- 其操作方式类似于数据结构中的栈。
- 函数调用时动态创建,函数返回时销毁。(堆向低地址生长)
- 常量区:编译期间确定,运行时只读,不可修改。
- 静态存储区:存储生命周期为整个程序运行期间的对象。
main函数执行之前
主要就是初始化系统相关资源:
- 设置栈指针
.data
段的内容:: 初始化静态static
变量和global
全局变量,.bss
段的内容:: 将未初始化部分的全局变量赋初值:- 数值型
short
,int
,long
等为0
bool
为FALSE
,- 指针为
NULL
等等, - 全局对象初始化,在
main
之前调用构造函数,这是可能会执行前的一些代码 - 将main函数的参数
argc
,argv
等传递给main
函数,然后才真正运行main
函数 __attribute__((constructor))
main函数执行之后:
- 全局对象的析构函数会在main函数之后执行;
- 可以用
atexit
注册一个函数,它会在main 之后执行; __attribute__((destructor))