全局变量+局部变量+静态局部变量+静态全局变量

来源:互联网 发布:淘宝蛋糕店排名 编辑:程序博客网 时间:2024/06/07 22:59

全局变量
作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件。)
生命周期:程序运行期一直存在
引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量。
内存分布:全局数据区
注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义
全局静态变量
作用域:文件作用域(只在被定义的文件中可见。)
生命周期:程序运行期一直存在
内存分布:全局数据区
定义方法:static关键字,const 关键字
注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个

完全不同的变量
静态局部变量
作用域:局部作用域(只在局部作用域中可见)
生命周期:程序运行期一直存在
内存分布:全局数据区
定义方法:局部作用域用中用static定义
注意:只被初始化一次,多线程中需加锁保护

int fac(int n){    static int nRet = 1;    //静态局部变量    nRet *= n;    return nRet;}int main(){    for(int i=1;i<5;i++)    {        printf("%d!=%d\n",i,fac(i));    }    getchar();    return 0;}

结果:
这里写图片描述
局部变量
作用域:局部作用域(只在局部作用域中可见)
生命周期:程序运行出局部作用域即被销毁
内存分布:栈区
注意:auto指示符标示

int fac(int n){    int nRet = 1;    //静态局部变量    nRet *= n;    return nRet;}int main(){    for(int i=1;i<5;i++)    {        printf("%d!=%d\n",i,fac(i));    }    getchar();    return 0;}

结果:
这里写图片描述
函数中在堆中开辟内存
0.申请方式和回收方式不同
堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义

一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请

的空间,例如malloc(10);开辟十个字节的空间。
由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后

就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦

忘记释放会造成内存泄露。还有其他的一些区别我认为网上的朋友总结的不错这里转述一下:
参考:http://blog.csdn.net/yunyun1886358/article/details/5632087
http://100926.blog.sohu.com/189515489.html

原创粉丝点击