一个面试题,OS或者编译器怎么识别是全局变量还是局部变量.

时间:2021-02-15 01:14:48
问:
局部变量和全局变量有什么区别,
操作系统或编译器是如何识别的.

24 个解决方案

#1


我的理解应该是根据变量的存储位置而定,比如:堆栈、静态内存、堆。
这个还是看看编译原理就清楚了,我下了那本经典的龙书结果看的人很累,太难了!

#2


生命周期不一样
就像LS说得,存储的地方不一样
个人见解

#3


操作系统或编译器识别应该根据代码块的“{”和“}”判断吧。

#4


变量 定义的位置决定了它是全局变量还是局部变量。只要是定义在函数体内的变量,就是局部变量。函数体外定义的就是全局变量。

#5


操作系统内根本不关心你是什么变量,它只管代理运行程序,也就是进程,负责这些进程之间的调度,不过如果要说操作系统本身也是进程,那倒可以理解;
编译器最终会把程序编译成可执行文件,就是对应的一条一条汇编指令,在程序运行过程中按照定义,就可以有不同的寻址方式,这个就是汇编的内容了,其实不同类型的变量就是寻址方式的不同,说到底还是存储位置不同。

#6


操作系统也需要识别全局变量??

#7


引用 4 楼 milkylove 的回复:
变量定义的位置决定了它是全局变量还是局部变量。只要是定义在函数体内的变量,就是局部变量。函数体外定义的就是全局变量。



#8


引用 5 楼 void_wuyu 的回复:
操作系统内根本不关心你是什么变量,它只管代理运行程序,也就是进程,负责这些进程之间的调度,不过如果要说操作系统本身也是进程,那倒可以理解;
编译器最终会把程序编译成可执行文件,就是对应的一条一条汇编指令,在程序运行过程中按照定义,就可以有不同的寻址方式,这个就是汇编的内容了,其实不同类型的变量就是寻址方式的不同,说到底还是存储位置不同。

++

#9



问:
局部变量和全局变量有什么区别,
============================
1.生存周期不同
2.作用域不同
3.编译器会保证全局变量的初始化,局部变量不作保证

操作系统或编译器是如何识别的.
============================
操作系统不识别。
编译器在语义检查的时候识别,具体怎识别,参考《编译原理》

#10


操作系统也要识别???他知道区!

#11


同意
引用 9 楼 bluesky12312388 的回复:
问:
局部变量和全局变量有什么区别,
============================
1.生存周期不同
2.作用域不同
3.编译器会保证全局变量的初始化,局部变量不作保证

操作系统或编译器是如何识别的.
============================
操作系统不识别。
编译器在语义检查的时候识别,具体怎识别,参考《编译原理》

#12


OS根本就不知道变量是什么东东。

#13


引用 6 楼 luciferisnotsatan 的回复:
操作系统也需要识别全局变量??

sp........
这个,关操作系统啥事儿?

#14


操作系统还不管你这些问题呢,人家管的是大事好不好

#15


变量是语言层次上的东西  方便人控制的
编译器根据变量定义位置确定是全局  还是局部
全局变量的数据  编译器会分配在堆(heap)上
局部变量的数据  则是运行时在栈(stack)上创建
操作系统负责按照编译器事先分配的地址把程序加载到内存

#16


识别是编译器的时,生成目标文件后,目标文件里有数据区,里面会记录类型的,
在链接生成可执行文件时会分配实际内存,根据变量的类型分为堆和栈。

#17


引用 13 楼 skyworth98 的回复:
引用 6 楼 luciferisnotsatan 的回复:
操作系统也需要识别全局变量??

sp........
这个,关操作系统啥事儿?


操作系统加载可执行文件,为全局变量分配了一个特定的内存区域,全局变量程序运行期间内有效。而局部变量总是在每次函数调用期间从堆栈上分配,函数返回后失效。

#18


引用 15 楼 xzlcc 的回复:
变量是语言层次上的东西  方便人控制的
编译器根据变量定义位置确定是全局  还是局部
全局变量的数据  编译器会分配在堆(heap)上
局部变量的数据  则是运行时在栈(stack)上创建
操作系统负责按照编译器事先分配的地址把程序加载到内存

全局变量怎么会分配在堆上??!!
全局变量与局部静态变量存放位置相同,都放在静态存储区。初始化过的变量存放在静态初始化区,编译时编译器会初始化这部分区域的值;未初始化或初始化为0的变量存放在静态非初始化区。

#19


另外,操作系统只分静态变量和自动变量,变量作用域是编译器规定的

#20


不是根据位置,编译器通常会建一个符号表,里面描述变量的各属性。语法检查与代码生成的时候访问并回填数据

#21


引用 9 楼 bluesky12312388 的回复:
问:
局部变量和全局变量有什么区别,
============================
1.生存周期不同
2.作用域不同
3.编译器会保证全局变量的初始化,局部变量不作保证

操作系统或编译器是如何识别的.
============================
操作系统不识别。
编译器在语义检查的时候识别,具体怎识别,参考《编译原理》


#22


全局变量在 静态存储区中
局部变量在 栈中

#23


引用 5 楼 void_wuyu 的回复:
操作系统内根本不关心你是什么变量,它只管代理运行程序,也就是进程,负责这些进程之间的调度,不过如果要说操作系统本身也是进程,那倒可以理解;
编译器最终会把程序编译成可执行文件,就是对应的一条一条汇编指令,在程序运行过程中按照定义,就可以有不同的寻址方式,这个就是汇编的内容了,其实不同类型的变量就是寻址方式的不同,说到底还是存储位置不同。

+1

#24


lz还是找本理论的书系统的学习下把,就有概念了

#1


我的理解应该是根据变量的存储位置而定,比如:堆栈、静态内存、堆。
这个还是看看编译原理就清楚了,我下了那本经典的龙书结果看的人很累,太难了!

#2


生命周期不一样
就像LS说得,存储的地方不一样
个人见解

#3


操作系统或编译器识别应该根据代码块的“{”和“}”判断吧。

#4


变量 定义的位置决定了它是全局变量还是局部变量。只要是定义在函数体内的变量,就是局部变量。函数体外定义的就是全局变量。

#5


操作系统内根本不关心你是什么变量,它只管代理运行程序,也就是进程,负责这些进程之间的调度,不过如果要说操作系统本身也是进程,那倒可以理解;
编译器最终会把程序编译成可执行文件,就是对应的一条一条汇编指令,在程序运行过程中按照定义,就可以有不同的寻址方式,这个就是汇编的内容了,其实不同类型的变量就是寻址方式的不同,说到底还是存储位置不同。

#6


操作系统也需要识别全局变量??

#7


引用 4 楼 milkylove 的回复:
变量定义的位置决定了它是全局变量还是局部变量。只要是定义在函数体内的变量,就是局部变量。函数体外定义的就是全局变量。



#8


引用 5 楼 void_wuyu 的回复:
操作系统内根本不关心你是什么变量,它只管代理运行程序,也就是进程,负责这些进程之间的调度,不过如果要说操作系统本身也是进程,那倒可以理解;
编译器最终会把程序编译成可执行文件,就是对应的一条一条汇编指令,在程序运行过程中按照定义,就可以有不同的寻址方式,这个就是汇编的内容了,其实不同类型的变量就是寻址方式的不同,说到底还是存储位置不同。

++

#9



问:
局部变量和全局变量有什么区别,
============================
1.生存周期不同
2.作用域不同
3.编译器会保证全局变量的初始化,局部变量不作保证

操作系统或编译器是如何识别的.
============================
操作系统不识别。
编译器在语义检查的时候识别,具体怎识别,参考《编译原理》

#10


操作系统也要识别???他知道区!

#11


同意
引用 9 楼 bluesky12312388 的回复:
问:
局部变量和全局变量有什么区别,
============================
1.生存周期不同
2.作用域不同
3.编译器会保证全局变量的初始化,局部变量不作保证

操作系统或编译器是如何识别的.
============================
操作系统不识别。
编译器在语义检查的时候识别,具体怎识别,参考《编译原理》

#12


OS根本就不知道变量是什么东东。

#13


引用 6 楼 luciferisnotsatan 的回复:
操作系统也需要识别全局变量??

sp........
这个,关操作系统啥事儿?

#14


操作系统还不管你这些问题呢,人家管的是大事好不好

#15


变量是语言层次上的东西  方便人控制的
编译器根据变量定义位置确定是全局  还是局部
全局变量的数据  编译器会分配在堆(heap)上
局部变量的数据  则是运行时在栈(stack)上创建
操作系统负责按照编译器事先分配的地址把程序加载到内存

#16


识别是编译器的时,生成目标文件后,目标文件里有数据区,里面会记录类型的,
在链接生成可执行文件时会分配实际内存,根据变量的类型分为堆和栈。

#17


引用 13 楼 skyworth98 的回复:
引用 6 楼 luciferisnotsatan 的回复:
操作系统也需要识别全局变量??

sp........
这个,关操作系统啥事儿?


操作系统加载可执行文件,为全局变量分配了一个特定的内存区域,全局变量程序运行期间内有效。而局部变量总是在每次函数调用期间从堆栈上分配,函数返回后失效。

#18


引用 15 楼 xzlcc 的回复:
变量是语言层次上的东西  方便人控制的
编译器根据变量定义位置确定是全局  还是局部
全局变量的数据  编译器会分配在堆(heap)上
局部变量的数据  则是运行时在栈(stack)上创建
操作系统负责按照编译器事先分配的地址把程序加载到内存

全局变量怎么会分配在堆上??!!
全局变量与局部静态变量存放位置相同,都放在静态存储区。初始化过的变量存放在静态初始化区,编译时编译器会初始化这部分区域的值;未初始化或初始化为0的变量存放在静态非初始化区。

#19


另外,操作系统只分静态变量和自动变量,变量作用域是编译器规定的

#20


不是根据位置,编译器通常会建一个符号表,里面描述变量的各属性。语法检查与代码生成的时候访问并回填数据

#21


引用 9 楼 bluesky12312388 的回复:
问:
局部变量和全局变量有什么区别,
============================
1.生存周期不同
2.作用域不同
3.编译器会保证全局变量的初始化,局部变量不作保证

操作系统或编译器是如何识别的.
============================
操作系统不识别。
编译器在语义检查的时候识别,具体怎识别,参考《编译原理》


#22


全局变量在 静态存储区中
局部变量在 栈中

#23


引用 5 楼 void_wuyu 的回复:
操作系统内根本不关心你是什么变量,它只管代理运行程序,也就是进程,负责这些进程之间的调度,不过如果要说操作系统本身也是进程,那倒可以理解;
编译器最终会把程序编译成可执行文件,就是对应的一条一条汇编指令,在程序运行过程中按照定义,就可以有不同的寻址方式,这个就是汇编的内容了,其实不同类型的变量就是寻址方式的不同,说到底还是存储位置不同。

+1

#24


lz还是找本理论的书系统的学习下把,就有概念了