- 栈:用来保存局部变量,作用域结束的时候自动回收(汇编中通过保存栈顶指针,结束的时候直接将栈针赋值成栈顶指针)
- 堆:保存new分配的内存,或者malloc,alloc分配的,需要程序员手动释放,delete或者free,当然,实在忘记了,整个程序文件结束时,操作系统会将之回收,操作系统有个功能可是内存管理
- 全局/静态存储区:全局变量和static后的变量存储的地方。static之后的有全局静态变量和局部静态变量,static修改标识符的链接属性,由默认的external变为internal。局部静态变量如果没有进行初始化,则默认为0,而自动变量没有初始化则是随机值
- 对于“分配内存”,由于局部静态变量存储在全局存储区,故应在程序执行前,编译时分配内存。
对于“初始化”,《C++Primer(5th)》(中文版185页)原话:局部静态变量在程序的执行路径第一次经过对象定义语句时初始化。
- 对于“分配内存”,由于局部静态变量存储在全局存储区,故应在程序执行前,编译时分配内存。
- 常量存储区:分成字面量,const常量,不允许修改。字面量 “abc”,const常量const int a = 5;必须初始化
- 代码区(text段):存放代码,不允许修改,可以执行的
- const char * arr = "avc" :“avc”保存在常量区(字面量),这里const表示常量指针,表示这个指针只能进行访问,不能修改指向区域,这里有没有const其实都一样
- char * arr = "123":字面量保存在常量存储区,arr不能去修改这个区域,但其实arr本来是可以修改指向区域的内容的
- const char arr[] = "1234":本来是一个字符数组[‘1’,‘2’,‘3’,‘4’,‘\0’]存放在栈区的,但是这里是常量字符数组,可能编译器会优化,将"1234"放在常量区中存储
- char arr[] = “abc”,普通的局部变量,存放在栈区