变量的作用域和生命周期

1、内存布局

1、栈区:存放函数的参数,局部变量等
2、堆区:动态内存分配(malloc)
3、静态全局区:静态全局区又划分为未初始化数据区(bss)、初始化数据区(data)、文字常量区(字符串常量、const修饰的静态变量和全局变量)
4、代码区(text):可执行文件的二进制代码(函数)
编译程序时,编译器就已经给 代码区 BSS区 data区规划了内存,但是这个时候没有分配空间,当程序运行时程序执行main’函数前先给代码区 BSS区 data区分配指定大小的空间,在执行main’函数时,运行到局部变量定义或动态申请空间是才给堆区、栈区开辟空间

2、作用域与生命周期

局部变量

作用域:在定义局部变量的函数体或代码块内
生命周期:程序运行至变量定义处时开辟空间, 函数或代码块结束之后局部变量释放空间。存储在栈上,局部变量未初始化的值为随机值。

静态局部变量

作用域:在定义局部变量的函数体或代码块内
生命周期: 运行main函数之前就已经开辟空间(以后代码运行至静态局部变量定义处,不执行),程序结束后释放空间,初始化的静态局部变量存储在data区,未初始化的静态局部变量存储在bss区,默认为0

全局变量

作用域:在整个工程内都可以使用,整个工程所有文件
生命周期: 执行main函数之前给全局变量开辟空间,程序执行结束后释放空间。初始化的全局变量存储在data区,未初始化的全局变量存储在bss区,默认为0

注意:全局变量如果跨文件使用需要声名,声明一般加上extern
a: 全局变量在任意文件定义都可以,如果其他文件需要使用,需要声明一下即可
b: 全局变量在.h文件中只声明,不定义
c:.h文件中对全局变量声明加上extern

静态全局变量

作用域:在当前文件
生命周期: 执行main函数之前给静态全局变量开辟空间,程序执行结束后释放空间。初始化的静态全局变量存储在data区,未初始化的静态全局变量存储在bss区,默认为0
注意: 静态全局变量只能定义不可以extern声明,不能用于其他文件,只能在当前文件使用

const修饰的变量

const修饰的静态变量和全局变量存储在文字常量区,不能被修改,const修饰的局部变量存储在栈区,可以通过指针指针间接修改

总结

作用域: 局部变量(普通局部和静态局部变量)在函数体或代码块之内, 静态全局变量作用域在当前文件 ,全局变量在整个工程(所有文件)
未初始化的值: 普通局部变量为随机值,其他变量为0
生命周期: 普通局部变量运行至定义处开辟空间,离开函数或代码块释放空间, 其他的变量执行main函数之前开辟空间,程序结束释放空间

静态全局函数

一般常定义的函数都是全局函数,在定义函数时加上static修饰,代表这是一个静态全局函数:
静态全局函数: 只能在当前文件使用,只能在当前文件声明,如果要在其他的文件中要调用静态全局函数,可以对静态全局函数做一层封装。

变量重名问题

1 就近原则, 如一个局部变量和一个全局变量同名,使用时看谁近.局部变量比全局变量近,使用的是局部变量
2 不同的作用域可以取相同的变量名,相同的作用域不能取相同的变量名(重定义错误)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值