全局变量和局部变量的区别

1.按作用域分析:

全局变量的作用域是整个程序,局部变量的作用域是声明它的函数

2.按生命周期分析:

全局变量的生命周期结束于应用程序结束,局部变量的生命周期结束于函数的结束

3.按内存分配区来分析:

首先内存分为如下几个区:

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。

5、程序代码区—存放函数体的二进制代码。

然后看一下他们分别存在哪个区:

全局变量(静态和非静态)、静态局部变量存在全局区;非静态局部变量存在栈区。

下面看一下具体的栗子:

int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 

int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
}

(1)静态全局变量和非静态全局变量

当一个源程序有多个源文件时,非静态全局变量时在所有源文件中有效,而静态全局变量只在声明它的源文件中有效

(2)静态局部变量和非静态局部变量

非静态的变为静态的局部变量后,改变了它的存储区(从栈区->全局区),改变了它的生命周期(从函数结束->程序结束)

时间: 2024-08-07 08:36:20

全局变量和局部变量的区别的相关文章

Java——全局变量与局部变量的区别

在Java程序中,会根据变量的有效范围将变量分为成员变量和局部变量,通常类的属性成为累的全局变量(成员变量),成员变量在整个类中都有效,在类的方法体中定义的变量称为局部变量,局部变量只在当前代码体中有效不能用于类的其他方法中.成员变量可与局部变量的名字相同,此时成员变量将被隐藏,即这个成员变量在此方法中暂时失效,只取局部变量的值.举个例子: 1 public class Man{ 2 static int age=20; 3 public static void main(String[] ar

Python中的全局变量与局部变量的区别

全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了 如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的.因此不建议这样使用,这样会使得程序很不健全 直接来看几个例子来理解全局变量和局部变量的区别吧: Demo1: def fun(x):       y=2       print("乘法

总结javascript中的全局变量和局部变量的区别以及声明函数和调用函数的区别

<!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8"/> <title></title> <script src="../js/jquery-1.10.2.js"></script> <script> // 1 i为全局变量 输出全局变量 function myName(

c语言:全局变量与局部变量的区别

静态的全局变量: 程序: #include<stdio.h> #include<stdlib.h> void fun()//fun为定义的一个函数 { int i = 0; static int num = 0; for (i = 0; i < 10;i++) { num = 0;//一旦进入for循环,全局变量就赋值为0 num++; printf("%d ",num); } } int main() { fun(); system("paus

全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别

一.程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变

C++中的全局变量、普通局部变量和静态局部变量的区别

在C++中,我们经常难以说清楚全局变量.局部变量和静态局部变量的区别.本博客从变量存储特性和标识符作用域两个角度区分这三个变量. 首先,我们来看看C++程序的内存区域是如何分配的. 从上图,我们可以看到,C++程序的内存区域分为代码区.全局数据区.堆区和栈区.其中,全局变量和静态局部变量存放在全局数据区,这两个变量在程序开始时就已经分配和初始化存储空间了.而普通局部变量存放在栈区,它在程序进入声明的代码块时生成,在结束代码块时删除. 其次,从标识符作用域的角度,我们可以认为: 1. 全局变量和静

【转】全局变量与局部变量在内存中的区别详细解析

转自:http://www.jb51.net/article/42012.htm 作者: 字体:[增加 减小] 类型:转载 时间:2013-10-11 我要评论 以下是对全局变量与局部变量在内存中的区别进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般

全局变量、局部变量、实例变量以及静态变量的区别

全局变量(globals): 也称为成员变量,属于某个类中定义的变量.在整个类中有效. 可分为: (1).类变量:又称静态变量,用static 修饰,可直接用类名调用,所有对象的同一个类变量都是共享同一块内存空间的. (2).实例变量:不用static修饰, 它只能通过对象调用 ,所有对象的同一个实例变量是共享不同的内存空间的. 局部变量(Local variables):是指那些在方法体中定义的变量以及方法的参数,它只在定义它的方法内有效.是相对于全局变量而言的. 当全局变量与局部变量同名时:

JavaSCript全局变量与局部变量

今天公司一个实习小妹子问我两段js代码的区别: [javascript] view plain copy <script type="text/javascript"> var a = "Hello"; function test(){ var a; alert(a); a = "World"; alert(a); } </script> [javascript] view plain copy <script ty