首先提出一个问题
全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
C语言经过编译之后会将内存分为以下的5个区域:
(1)栈(stack):由编译器进行管理,自动的分配和释放,存放函数调用过程中的各种参数,局部变量,返回值以及函数的返回地址。操作方式类似数据结构中的栈。
(2)堆(heap):用于程序动态申请分配和释放空间。C语言中的malloc和free,c++中的new和delete都是在堆中进行的。正常情况下,程序员申请的空间在使用后应该释放掉,若程序员没有释放空间,则程序结束时系统自动回收。注意,这里的“堆”并不是数据结构中的“堆”。
(3)全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。
程序运行结束时自动释放。其中,BSS段在程序执行之前会被系统自动清0,所以未初始化的
全局变量和静态变量在程序执行之前已经为0.
(4)文字常量区:存放常量字符串。程序结束后由系统释放。
(5)程序代码区:存放程序的二进制代码。
有如下代码:
分别定义了全局外部变量k1,k2,静态外部变量k3,k4,以及内部静态变量m1,m2,以及p存放字符串,q动态申请的变量
可以看到,上面提到的五大区都有展现:
变量在栈区进行存储
P是动态申请的变量,在堆区进行(与上面的栈区地址有区别)
初始化的全局变量和静态变量存储在同一区域;即DATA段。未经过初始化的全局变量和静态变量存储在BSS段
文字常量区即存放的是程序中的字符串
程序区存放的是程序的二进制代码。
刚才提出来的问题,显然,是有区别的,全局变量保存在内存中的全局存储区中,占用的是静态的存储单元,也就是永久性存储单元;局部变量保存在栈中,只有在函数调用时才会被动态的分配存储单元。