1、首先,讲下 “堆 heap” 和 “栈 stack” 的区别:
一个由 c/c++编译过的程序占用的内存分为一下几个部分
(1)、栈区 stack :由编译器自动分配释放,存放函数的参数值,局部变量的值等。这个栈的操作方式类似于数据结构中的栈。
(2)、堆区 heap :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,注意它与数据结构中的堆是两回事,分配方式类似于链表。
(3)、全局区(静态区)static : 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量又放在相邻的另一块区域中。程序结束后由系统释放。
(4)、文字常量区 : 常量字符串放在这里。程序结束后由系统释放。
(5)、程序代码区 : 存放函数体的2进制代码。
根据变量的位置可以分为全局变量和局部变量
根据变量的静态属性可以分为静态变量和非静态变量。
根据变量的const属性可以分为const变量和非const变量。
针对上面的几种变量分类,变量的初始化分为以下几种:
全局变量和局部变量的不同主要体现在变量的作用范围上,全局变量的初始化分为两种,非类对象的变量的初始话发生在函数的编译阶段,如果我们没有显示的初始化,编译器会默认初始化,类类型的全局变量的初始化发生在程序运行阶段的Main函数之前。对于局部变量,不会执行默认初始化,因此在使用局部变量之前必须先进行变量的初始化。
静态变量和非静态变量的初始化:
静态变量的分类:静态变量根据其位置可以分为三种:全局静态变量、定义在函数中的静态变量以及定义在类中的静态变量。
静态变量的初始化:编译器要求不同,有的要求必须主动完成初始化,有的编译器会完成默认初始化,但是值不确定。所以,在使用静态变量的时候,我们一般要求必须在定义的同时完成初始化。对于g++编译器,如果静态变量是全局或者函数的局部变量,都会完成默认初始化。但是如果类包含静态数据