Huge Lemon的博客

C语言中变量存储位置

2020-02-01

局部变量、静态局部变量、静态全局变量…

一、C语言中,常量存储在哪儿?static全局变量和static局部变量存储在哪儿?

全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于

非静态全局变量的作用域是整个源程序,
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,
而静态全局变量则限制了其作用域。
即只在定义该变量的源文件内有效,

在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。

二、static全局变量与普通的全局变量有什么区别?

  • static全局变量只初始化一次,防止在其他文件单元中被是引用。

三、static局部变量与普通的局部变量有什么区别?

  • static局部变量只被初始化一次,下一次依据上一次结果值。

四、局部变量、静态局部变量、静态全局变量存储位置

变量类型 存储位置
局部变量 静态区(全局区)
局部静态变量 静态区(全局区)的常量区
全局静态变量 静态区(全局区)

五、各存储区的定义

  1. 栈区(stack) —— 由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。

  2. 堆区(heap) —— 一般由程序员分配释放。若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

  3. 全局区(静态区)(static) —— 全局变零和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,- 程序结束后由系统释放

  4. 文字常量区 —— 常量字符串就是放在这里的。- 程序结束后由系统释放

  5. 程序代码区 —— 存放函数体的二进制代码

六、NOTES

  1. ,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

  2. ,就是那些由new分配的内存块,他们的释放编译器不去管,由应用程序控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

  3. 自由存储区,就是那些由malloc分配的内存块,它和堆十分相似,不过它是用free来结束自己的生命。

  4. 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分,它们共同占用一块内存区。

  5. 常量存储区,这是一块比较特殊的存储区,它们存放的是常量,不允许被修改

Tags: C/C++
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏