-
2021-02-27 12:29:08
答:有区别。全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
该题目考查的知识点是变量的存储类型及性质。C语言经过编译之后将内存分为以下几个区域:
(1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。
(2)堆(heap):用于程序动态申请分配和释放空间。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意:这里的“堆”并不是数据结构中的“堆”。
(3)全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。
(4)文字常量区:存放常量字符串。程序结束后由系统释放。
(5)程序代码区:存放程序的二进制代码。
显然,C语言中的全局变量和局部变量在内存中是有区别的。C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。
有兴趣的读者可以运行下面的程序,分析一下运行结果。
#include
#include
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{
staticint m1=2, m2;
inti=1;
char*p;
charstr[10] = "hello";
char*q = "hello";
p= (char *)malloc( 100 );
free(p);
printf("栈区-变量地址 i:%p\n", &i);
printf(" p:%p\n", &p);
printf(" str:%p\n", str);
printf(" q:%p\n", &q);
printf("堆区地址-动态申请:%p\n", p);
printf("全局外部有初值 k1:%p\n", &k1);
printf(" 外部无初值 k2:%p\n", &k2);
printf("静态外部有初值 k3:%p\n", &k3);
printf(" 外静无初值 k4:%p\n", &k4);
printf(" 内静态有初值 m1:%p\n", &m1);
printf(" 内静态无初值 m2:%p\n", &m2);
printf("文字常量地址 :%p, %s\n",q, q);
printf("程序区地址 :%p\n",&main);
return0;
}
---------------------
作者:taxue505
来源:CSDN
原文:https://blog.csdn.net/yangquanhui1991/article/details/51786380/
版权声明:本文为博主原创文章,转载请附上博文链接!
更多相关内容 -
java全局变量
2021-02-12 09:55:44“java中全局变量应该放哪儿? ”引发的争论1、单独写一个final的类,在里面定义finalstatic的全局变量,在其它程序里包含进来就可以了。2、类中的任何staticpublic的成员变量都是全局共享的。3、JAVA中不应该有所谓...“java中全局变量应该放哪儿? ”引发的争论
1、单独写一个final的类,在里面定义final static的全局变量,在其它程序里包含进来就可以了。
2、类中的任何static public的成员变量都是全局共享的。
3、JAVA中不应该有所谓全局变量的概念,全局变量严重影响了封装和模块化,所以如果你的程序中需要所谓的全局变量,那一定是你对程序的设计出了问题。
4、那JAVA提供FINAL STATIC 干吗用啊,存在即合理,很多情况是需要用到全局变量的。他能减少参数的传递,能避免重复声明。
5、FINAL STATIC应该理解为常量,而不是“全局变量”,它的目的不是为了让你每个类都可以访问,而是独立于具体对象,抽象到类层次的东东。
6、class Global { public static final String APPNAME= "xyz"; // global constant public static String currentUser = "abc"; // global variable ... } class WhatEver { ... System.out.println(Global.APPNAME); Global.currentUser = "Williams"; }
7、JAVA中不应该出现”全局变量“的概念。以上争论的焦点是:public static final 类型 变量 是否属于所谓的“全局变量”不得而知。它只不过实现了全局的意图。我们要用到该变量时,只需要把该变量所在的类引用进来就可以了。这不正是我们所需要的吗?不过还是要强调一定要真正理解JAVA当初出现的初衷就是为了安全性和跨平台性。 去掉了类似C,C++中的全局变量的概念,就是基于此的。
8、有了全局变量安全性就差了。
9、不用全局变量固然不无道理,但是世事无绝对,看运用,有的时候垃圾也能变成王道!
就象goto一样,他本身没什么错,错在运用者,用的过多过滥当然不对,但是为了避免使用GOTO却用1000行来饶开,难道看1000行代码就一定看的很清晰吗?java的全局变亮也是一样,不能用的太滥,什么东西都往全局上靠图省事自然会出问题,但是过度恐惧不敢用也不可取,该用的场合还是要用的.特别是独体类型,全虚拟机只有一份,数据库连接池对象一般就是独体对象,至于原因,我想不用我多说了吧!
10、如果一个栈内存段就能搞定的事情,为何要用多个堆内存段来实现呢?
11、对于“象goto一样,他本身没什么错,错在运用者,用的过多过滥当然不对,但是为了避免使用GOTO却用1000行来饶开,难道看1000行代码就一定看的很清晰吗?”确实全局变量在某些环境下可能还有其实际的意义。但是在JAVA中,确实没有所谓的全局变量的概念,通过设置一个abstract class or interface,并将许多final or final static field置于其中,并在使用时调用ClassName.xxx or InterfaceName.xxx来模拟全局变量的使用(可以肯定的是,在许多的著作中大师们都已经反复强调了将许多常数放入一个abstract class or interface,并使之成为常数类或常数接口的做法是对此功能的误用,并不鼓励如此使用,有兴趣可以参阅《effective java》——机械工业出版社出版 Joshua Bloch 著),
但首先,final or final static确实不是全局变量的概念,在JAVA中,一切都是对象,在对象中声明的无论是field还是method亦或是property都将归属于某一种抽象或具体类型,否则也不会在调用中使用ClassName.xxx or InterfaceName.xxx这样的形式来加以说明这是这个CLASS的XXX,那是那个INTERFACE的XXX。事实上final代表的是一种常量形式(Constant),而static则代表一种静态观念,常量的概念是为了区别于变量而存在的不变的变量(有些别扭,突然发现自己词语贫乏,HOHO),而静态则是希望区别于某一具体Object而独立存在于某一特定类型的变量(到可以称之为该类型的全局变量,但个人感觉不很确切)。全局变量的概念显然过于宽泛,以至于我们说一个程序甚至是一个系统拥有一个唯一的变量变成可能,但final or static显然不是为其而设计的(当然可以模拟)。其次,阁下提到的有关于“全虚拟机只有一份,数据库连接池对象...”是设计模式中所谓单例模式的实际应用,该模式确实非常像所谓的全局变量的概念,但设计这样单个实例确实是因为在系统的整个生命周期中只需要一份该实例存在的缘故,更多的是突出概念而非实际应用,而全局变量则更多就是为了实际应用而生,这样就会导致许多不成熟的,不加思考的应用加于其上而导致黏糊的像意大利面条一样的代码。所以个人认为,依在下实在低微的学识实在不敢胡乱评说关于全局变量是否有实际意义这样巨大的课题,这样的课题还是留给那些专家去讨论吧。至于如何实际应用全局变量,我看,还是有则去之,无则加冕吧,实在要用偶也么的办法(不过自从使用C++/JAVA开始,全局变量的使用确实降到了一个极低的程度,也许是因为在下的代码写的还是太少的缘故吧,呵呵...)。
12、static 变量可以使用,不要认为程序中出现了static成员或方法就是程序写的不好,用不用静态成员与程序写的好坏没有直接的因果关系,不要钻牛角尖。
13、interface Global { public static final }
-
面试题-java中全局变量与局部变量在内存中的区别?
2021-04-22 09:42:58java中全局变量与局部变量在内存中的区别? 首先java中无全局变量概念,java中叫成员变量. 结论: 局部变量存储在jvm栈中,成员变量如下: 1、jdk1.6 成员变量均存储在常量池中也就是方法区中的常量池中 2、jdk...首先java中无全局变量概念,java中叫成员变量.
- 局部变量存储在栈中
- 全局变量(java中无全局变量概念,java中叫成员变量)
成员变量均存储在方法区中,JVM只是定义了方法这个概念,并没有定义它的具体组成
1、jdk1.7方法区(习惯上把永久代叫着方法区)
2、jdk1.8方法区(由元数据区+堆组成),其中字符串常量池被放在堆中
jdk1.7的永久代在jdk1.8中去掉并换成元数据区,以上都是针对hotspot虚拟机
-
Java全局变量存放在哪里?
2021-02-12 18:46:20有人问,那全局变量*(对象)存放在哪里. 其实全局变量就是参考文章中所说的class的字段,就是指全局变量,它是存放在方法区中的。e)方法区与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的...我们说 常量,静态变量存放在方法区中,方法中的临时变量,存放到Java 虚拟栈中。有人问,那全局变量*(对象)存放在哪里. 其实全局变量
就是参考文章中所说的class的字段,就是指全局变量,它是存放在方法区中的。e)方法区
与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后, 对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。
下面我们通过一个例子来看是否是这样的。public class TestClass {
private Class1 class1 =new Class1();
private int m;
public int intc(){
int count =2;
return m +1;
}
}
public class Class1 {
public Class1(){}
}
首先通过 javac 命令将TestClass
-
java中全局变量和局部变量的区别是什么?
2021-03-06 06:00:01全局变量是编程术语中的一种,源自于变量之分。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。局部变量(Local variables):在方法内部(包括main()方法... -
java设置全局变量
2020-12-19 04:47:32图片来源于网络,如有侵权请联系删除前言java系统自带的api很多,而设置全局变量也是有在System对象中一个具体的方法,而Springboot启动类一层层递进的过程中就有使用该方法来存储全局变量。1.实例在Springboot中的... -
java变量之全局变量(静态变量,成员变量),局部变量,的关系和区别
2021-09-24 12:40:34可能刚学java对这些变量很懵,直接上图,接下来进行代码解释 ...2:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。 3:简单来说就是被static修饰后的值可以直接类... -
Java静态全局变量与全局变量的区别
2019-01-16 09:58:55Static全局变量与普通的全局变量有什么区别? 答: 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上... -
java 如何查看全局变量占用内存大小
2021-02-12 13:35:07Java程序计算各种对象所占内存的大小的方法。基类:public abstract class SizeOf {private final Runtime s_runtime = Runtime.getRuntime();/**** 子类负责覆盖该方法以提供被测试类的实例** @return 被测试类的... -
java全局变量和局部变量
2017-07-19 11:07:11全局变量是一个运行时刻实体,它在程序的整个执行过程中都存在。全局变量生命周期为程序开始到程序结束。 全局变量显示初始化时,或者未初始化时,在程序映像中有不同的分区:已初始化的全局变量是可执行模块的一... -
浅谈java中的局部变量和全局变量
2021-03-25 09:53:42本文对java中的局部变量和全局变量作了如下介绍:1、局部变量:局部变量的定义:定义在方法中的变量都是局部变量(main方法也是方法,所以定义在main方法中的变量也是局部变量)。生存时间:局部变量的生存时间和方法... -
浅谈Java开发中如何定义的全局变量
2021-03-05 18:02:37Static静态变量在程序中任何变量或者代码都是在编译时,是由系统自动分配内存来存储的,而所谓静态就是指在编译后分配的内存会一直存在,直到程序退出时才会释放内存空间。static是静态修饰符。被static修饰后的成员... -
java中的全局变量与局部变量的区别
2021-12-17 12:01:43全局变量与局部变量的区别学习之前必须了解的基础知识一、定义的位置二、作用的范围三、默认值四、内存位置五、生命周期 很多人在刚开始学习编程时,都会被全局变量和局部变量搞得头晕脑胀。我对此从以下方面进行... -
Java全局变量和局部变量初始化问题
2020-02-21 23:24:53我们先来看一个比较的例子,最近在知乎看到的帖子。... //类的成员变量 public static void main(String[] args) { TestDemo td =new TestDemo(); //默认的构造方法 System.out.println(td.a); ... -
Java线程安全问题指的是全局变量,还是静态变量?
2021-02-26 11:28:48这个问题的答案是静态变量和全局变量都可能引起线程安全问题。这两种变量引起线程安全问题的原因和区别如下:1、静态变量静态变量即静态成员变量。只要有修改变量值的操作,无论是在单例或者非单例都是线程不安全的... -
java 图说 全局变量 成员变量 静态变量 实例变量 局部变量 的关系和区别
2019-03-30 18:57:02版权声明:Hi,屏幕前的猿你好,此篇博文中的内容如帮到你,请一定不能吝啬帮我点赞,评论,关注,帮我来个全套大保健呢!我愿与你一同成长变强,得到技术加持,祈愿!...刚入门java时,对这些个各种名称... -
java中的成员变量和全局变量有什么区别?
2021-02-27 14:26:59java中就没有全局变量这个概念,只分为成员变量和局部变量。成员变量:Static修饰成为类变量或静态变量,还有就是方法外的变量。生命周期与类相同。局部变量:就是方法中的变量。生命周期就是再次方法中。但是,很多... -
java 全局变量危害
2017-06-19 14:06:05// java 全局变量危害 // 最近为了图快捷,使用了全局变量 ,然后就想到了一些危害 // 1.线程不安全:线程中多个全局变量,修改容易冲突,需要加锁 // 2.增加耦合性:修改全局变量可能会影响其他模块 // ... -
全局变量的使用和声明
2021-04-14 10:43:48Java和C、C++对于变量声明、参数传递、操作符、流控制等,Java使用了和C、C++相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。同时,Java为了实现其简单、鲁棒、安全等特性,也摒弃了C和C++中许多不合理的... -
Java中对象及常量,局部变量,全局变量的存储位置
2020-09-10 17:07:27here 1Java中对象的存储位置 String aa = new String();...4.Java中全局变量和Static常量的存储位置 存放在全局数据区内存中 5.java中static修饰的成员变量及参数存放位置 存放在代码段内存中 ... -
java变量与内存深入了解
2021-02-26 15:25:27=========================================================================================在我看来,学习java最重要是要理解what(这东西是什么),why(为什么要用它),where(在哪用它),how(怎么用)。... -
java--局部变量和全局变量
2020-12-05 16:21:02java区分局部变量和全局变量 1、局部变量: 局部变量的定义:定义在方法中的变量都是局部变量(main方法也是方法,所以定义在main方法中的变量也是局部变量)。 生存时间:局部变量的生存时间和方法的生存时间... -
在Java中关于静态变量和全局变量什么时候初始化的问题
2017-10-09 11:52:08首先我们都知道静态变量是随着类的加载而加载的,所以当类...再者就是全局变量也就是成员变量,全局变量(成员变量)是在创建对象的时候初始化的,所以只要创建对象就会初始化全局变量(成员变量),并存放在堆内存中。 -
java的成员变量(全局变量)到底存在堆里还是方法区里
2021-03-17 13:03:46大家都知道,局部变量是存在于栈里的,随着方法的调用而产生,随着方法的执行完毕而消失,因为栈是线程私有的,所以局部变量也是线程安全的。那成员变量又是存在于哪里呢,网上有的说是在堆里,有的说在方法区里,... -
成员变量与全局变量的区别
2021-03-10 04:18:54全局变量:也叫成员变量,是指在类中定义的变量;它在整个类中都有效全局变量又可分为:类变量和实例变量1.类变量:又叫静态变量 用static修饰 它可以直接用类名调用 也可以用对象调用 而且所有对象的同一个类变量都... -
Java参数传递传值还是传引用以及全局变量的使用问题
2020-10-01 12:02:35这样理解,引用类型的变量存储在栈中,其数值表示堆上对象的内存地址。调用函数时,会把这个变量的值(引用类型的话也就是对象地址)拷贝一份在栈上,传递给函数,此时在函数内重新给形参赋值并不会影响到外部的那个... -
静态变量static和全局变量global
2021-03-04 05:42:25静态变量static ,全局变量global静态变量在java也叫类变量从名字可以看出它是属于某个类的而不是类的实例。它的关键字是static存储在静态存储区,当程序执行,类的代码被加载到内存,类的静态变量就分配了内存空间,... -
golang的gc回收针对堆还是栈?变量内存分配在堆还是栈?
2021-01-07 22:21:03引用类型的全局变量内存分配在堆上,值类型的全局变量分配在栈上 局部变量内存分配可能在栈上也可能在堆上 堆和栈的简单说明: 1.栈(操作系统):由操作系统自动分配释放 2.堆(操作系统): 一般由程序员分配释放...