全局变量和静态局部变量有什么区别?

本文详细阐述了全局变量与静态局部变量的区别,包括作用域、连接性和存储位置的不同,并通过示例代码说明如何正确使用这两种变量。

全局变量和静态局部变量有什么区别?

 

存储的地方是一样的,不同之处在于它们的作用域不同:
全局变量基本上在程序的任何地方都能被看到
而静态局部变量只能在其指定的范围内被使用
比如

int i ; // 全局变量

class C
{
public:
static int i_C; // 静态局部变量
}

void main()
{
i = 1; // 合法
i_C = 1; // 错误
C::i_C = 1; // 合法

C cc;
cc.i_C = 2; // 合法
}

 

 

2、

全局变量具有外部连接性,即同一工程中其它文件中的也可引用。
而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。
如:
//cpp1.cpp
extern int x=10;
static int y=5;

//cpp2.cpp
#include <iostream.h>
void main()
{
extern int x;
extern int y;
cout<<x<<endl;
cout<<y<<endl;
}
将这两个文件放在同一工程中,你发现每一文件单独编译能通过,但作为工程不能构成.exe文件运行。若将有关变量y的行注释后(或将static换成extern)就可以了。这是因为静态变量的作用域在本文件内,不能扩充到其它文件。其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。

 

 

 

3、静态局部变量

在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其初始化为0
静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作的运行结果也不同。

在C语言中,程序的内存布局被分为多个段,其中 **BSS段** **数据段** 是用于存储全局变量静态局部变量的关键部分。 ### 回答问题: #### 1. **什么是BSS段?** BSS(Block Started by Symbol)段是程序内存布局的一部分,专门用于存储未初始化的全局变量静态局部变量。这些变量在程序启动时会被自动初始化为0。 #### 2. **全局变量静态局部变量如何存储?** - **已初始化的全局变量静态局部变量**:存储在 **数据段** 中。数据段分为两个部分: - 已初始化数据段:存储显式初始化的全局变量静态局部变量。 - BSS段:存储未初始化的全局变量静态局部变量。 - **未初始化的全局变量静态局部变量**:存储在 **BSS段** 中。尽管它们没有显式初始化,但在程序加载时,操作系统会将BSS段的内容清零。 以下是示例代码展示不同类型的变量存储位置: ```c #include <stdio.h> // 存储在已初始化数据段 int initializedGlobalVar = 42; // 存储在BSS段 int uninitializedGlobalVar; void func() { // 存储在栈上 int autoLocalVar = 10; // 存储在BSS段 static int uninitializedStaticLocalVar; // 存储在已初始化数据段 static int initializedStaticLocalVar = 20; printf("initializedGlobalVar: %d\n", initializedGlobalVar); printf("uninitializedGlobalVar: %d\n", uninitializedGlobalVar); printf("autoLocalVar: %d\n", autoLocalVar); printf("uninitializedStaticLocalVar: %d\n", uninitializedStaticLocalVar); printf("initializedStaticLocalVar: %d\n", initializedStaticLocalVar); } int main() { func(); return 0; } ``` ### 给出解释: 1. **`initializedGlobalVar`**:这是一个已初始化的全局变量,存储在已初始化数据段中。 2. **`uninitializedGlobalVar`**:这是一个未初始化的全局变量,存储在BSS段中。程序启动时,它会被自动初始化为0。 3. **`autoLocalVar`**:这是一个动态局部变量,存储在栈上。它的值由程序员显式赋值。 4. **`uninitializedStaticLocalVar`**:这是一个未初始化的静态局部变量,存储在BSS段中。程序启动时,它会被自动初始化为0。 5. **`initializedStaticLocalVar`**:这是一个已初始化的静态局部变量,存储在已初始化数据段中。 ### 注意事项: - 动态局部变量(如 `autoLocalVar`)存储在栈上,其生命周期仅限于函数调用期间。 - 静态局部变量全局变量存储在数据段中,其生命周期是整个程序运行期间。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值