全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

本文详细阐述了全局变量与局部变量在生命周期、使用方式及内存分配上的区别。全局变量随主程序创建和销毁,可在程序各处使用;局部变量仅在其定义的作用域内有效,并在该作用域结束时销毁。

生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在; 内存中分配在全局数据区。

  使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。  操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。

了解变量在内存中的存储位置对于编写高效、稳定的代码至关重要。为了帮助你深入理解这一点,建议阅读《理解程序变量的存储位置:从静态到动态》。这本书详细解析了在Linux环境下,使用GCC编译器时变量的存储位置,以及不同类型的变量如何分配到内存的不同区域。 参考资源链接:[理解程序变量的存储位置:从静态到动态](https://wenku.youkuaiyun.com/doc/8b15xaav1f?spm=1055.2569.3001.10343) 在LinuxGCC的环境中,变量的存储位置可以分为几个主要区域: 1. **全局变量静态变量**:这些变量被存储在可执行文件的数据段(.data或.bss节),其中已初始化的全局变量存储在.data节,未初始化的全局变量则存储在.bss节。静态变量的处理方式与全局变量相似,但它们的作用域限定在声明它们的文件或模块内。 2. **局部变量**:局部变量通常存储在栈上。每当函数被调用时,它们的值就会被压入栈中;当函数返回时,这些变量也随之消失。 3. **动态分配的内存**:当使用malloc、calloc等函数动态分配内存时,分配的内存位于堆上。堆是用于存储程序运行时动态分配的数据的区域,其大小在运行时可以改变。 在编程实践中,我们可以使用GCC的编译选项来查看程序的内存布局。例如,使用`-c`选项来生成目标文件,并结合`-g`选项来包含调试信息,进而使用`readelf`或`objdump`工具来分析ELF文件的各个节。此外,GCC提供的`-fverbose-asm`选项可以在汇编输出中显示变量信息。 举个例子,考虑以下代码段: ```c int globalVar = 1; // .data节 char str[] = 参考资源链接:[理解程序变量的存储位置:从静态到动态](https://wenku.youkuaiyun.com/doc/8b15xaav1f?spm=1055.2569.3001.10343)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值