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

本文详细解释了全局变量与局部变量的区别,包括它们的作用域、生命周期及存储位置。全局变量在整个程序执行期间有效,存储在静态存储区域;局部变量仅在其定义的作用域内有效,通常位于栈中。

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

  
      区别就是作用域的区别,局部变量局部可见,全局变量,所有参与链接的模块都可以通过extern来操作该变量.

局部变量
{
}
内部定义的非静态变量都是局部变量了
全局变量:在函数外部定义的非静态变量就是全局变量了

      操作系统不需要知道谁是局部,谁是全局的。编译器根据变量定义的位置,类型来判断是全局的还是局部的变量
  
 
生命周期,访问范围
数据段,栈
操作系统为什么需要知道?(可执行文件格式 ?)    编译器根据声明的位置
 
全局变量为外部变量,其作用域是从定义点到程序结束..
局部变量就表示局限于某个作用域的变量,它可以在函数内以函数作为作用域,可以在for/while/if语句中,以语句块作为作用域,还可以在namespace中,以命名空间作为作用域.

在操作系统中,全局变量存储在内存的静态存储区域,而局部变量存放在内存的栈区.
 
全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
     全局变量和局部变量的区别是作用域不同,全局变量从定义位置开始到程序结束,而局部变量只限定义的函数内可使用,全局变量在数据段,而局部变量在栈,局部 变量在函数结束时内存空间就被系统收回,所以要返回的数组或字符串不要用局部变量定义.extren和在main()函数外定义的变量都称为全局变量,操 作系统和编译器从定义变量为变量分配内存时,从变量的定义和存储区域来分别局部变量和全局变量.
 
这是编程之基本啊~~,1楼正解!
    全局都放在静态存储区,局部一般临时分配在栈里,生命周期到,自动释放内存!
    去看下函数中的变量,auto,static,extern,register!~~ 
    操作系统和编译器通过内存分配的位置来知道的全局变量分配在全局数据段,并且在程序被运行的时候就被加载。
     编译器通过语法词法的分析,判断出是全局变量还是局部变量。如果是全局变量的话,编译器在将源代码翻译成二进制代码时就为全局变量分配好一个虚拟地址 (windows下0x00400000以上的地址,也就是所说的全局区),所以程序在对全局变量的操作时是对一个硬编码的地址操做。
     局部变量的话,编译时不分配空间,而是以相对于ebp或esp的偏移来表示局部变量的地址,所以局部变量内存是在局部变量所在的函数被调用时才真正分配。 以汇编的角度来看:函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存,另外局部变量可以直接分配在寄存器中。

操作系统通过变量的分配地址就可以判断出是局部变量和全局变量。
了解变量在内存中的存储位置对于编写高效、稳定的代码至关重要。为了帮助你深入理解这一点,建议阅读《理解程序变量的存储位置:从静态到动态》。这本书详细解析了在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)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值