C++ 静态变量之为什么只初始化一次

 我来答
挚爱一萌909637
推荐于2017-10-11 · TA获得超过160个赞
知道答主
回答量:114
采纳率:100%
帮助的人:129万
展开全部
以下内容由在论坛中讨论而成,在此总结一下: 首先问题来自这个函数:[cpp]int fun(){ static int i=0;i++;return i;}当这个函数被反复调用时,i的值是会一直加的,也就是静态变量只被初始化了一次. 我对此产生了疑惑.不知道大家有没有.当改为:[cpp]int fun(){int i=0;i++;return i;}反复调用时都返回的是1; 这个例子很明白,虽然i这个变量时同名的,但是地址是不一样的,这是一个新的变量,因为在作用域后,原变量被销毁了.接着创建一个新的变量. 那么这里我们就知道了一件事情:就是静态变量是全局的,和程序的生命周期是一样的. 那么原来的staic的i依然存在. 但是它的可访问区域就只能是定义的作用域,而不一定能全局访问,这是全局变量的一个差别. 而静态变量的必须初始化,如果没有显示初始化,则初始化为0 ,'0'或者其他. 初始化在程序第一次加载中开始.并设置了相应的标志位! 所以当变量重复时,编译器忽略了重复初始化的代码,到这里就算是C++只能初始化一次的原因了!另外参考: 操作系统在加载程序时会根据程序中的声明部分为程序分配内存空间(这部分数据是由编译器生成的)。程序所支配的内存空间分为两大部分:静态区域和动态区域(至于为什么这样区分涉及到硬件知识,建议LZ不要深究):动态区域用于存储经常会变动的数据(动态区域又分为两大部分:栈和堆,关于这两个部分大家应该都很熟悉了);静态区域(Java里称为永久区域)用于存储不会经常变化的数据,例如程序的指令代码(C/C++里就是各个函数编译后得到的代码)、用户类型(结构体、类)的声明代码、全局变量、静态变量PS:有些例子提到用静态变量来做递归的计数器,那只是为了说明静态变量的特性。实际上不推荐这种用法,因为这样会对程序性能造成轻微的影响。静态区域内的数据会在程序加载时进行初始化,生存期为程序运行的全部时间。另外,纠正LZ的一个误解:任何变量都只进行一次初始化。局部变量在程序块结束时生存期就结束了,下次再调用这个程序块时从原理上说声明的是另一个变量了(分配到的地址也不一定一样)。PS:在不同编译器的不同编译情况时,实际的内存分区可能不同。例如TC的Small模式下堆和栈区是重合的,而Tiny模式下连静态区域和动态区域都是重合的。
百度网友6fa3859
2016-01-16 · TA获得超过3349个赞
知道小有建树答主
回答量:1148
采纳率:85%
帮助的人:424万
展开全部

  静态变量存放在静态存储区,普通的局部变量存放在堆栈中。因为入栈和出栈等操作,函数退出后,堆栈中的内容会被改变,所以局部变量的值会发生改变。而静态变量不会,那块内存区域不会被程序和系统自动改变,需要自己编码来改变它,所以只初始化一次就可以。

    举个例子:

#include <stdio.h>

void fun()
{
    static int num = 1;
    
    printf("%d\n", num);
    num = 5;
}

int main()
{
    fun();
    fun();
    
    return 0;
}

   两次调用fun函数,第一次输出1,第二次输出5.因为第一次调用改变了num的值,第二次进入函数的时候,num保持原有的值不变,还是5.

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
请不要让我发现
2015-11-11 · TA获得超过227个赞
知道答主
回答量:124
采纳率:0%
帮助的人:68.1万
展开全部
首先问题来自这个函数:[cpp]int fun(){
static int i=0;i++;return i;}当这个函数被反复调用时,i的值是会一直加的,也就是静态变量只被初始化了一次.
我对此产生了疑惑.不知道大家有没有.当改为:[cpp]int fun(){int i=0;i++;return i;}反复调用时都返回的是1; 这个例子很明白,虽然i这个变量时同名的,但是地址是不一样的,这是一个新的变量,因为在作用域后,原变量被销毁了.接着创建一个新的变量.
那么这里我们就知道了一件事情:就是静态变量是全局的,和程序的生命周期是一样的.
那么原来的staic的i依然存在. 但是它的可访问区域就只能是定义的作用域,而不一定能全局访问,这是全局变量的一个差别.
而静态变量的必须初始化,如果没有显示初始化,则初始化为0 ,'0'或者其他.
初始化在程序第一次加载中开始.并设置了相应的标志位!
所以当变量重复时,编译器忽略了重复初始化的代码,到这里就算是C++只能初始化一次的原因了!另外参考:
操作系统在加载程序时会根据程序中的声明部分为程序分配内存空间(这部分数据是由编译器生成的)。程序所支配的内存空间分为两大部分:静态区域和动态区域(至于为什么这样区分涉及到硬件知识,建议LZ不要深究):动态区域用于存储经常会变动的数据(动态区域又分为两大部分:栈和堆,关于这两个部分大家应该都很熟悉了);静态区域(Java里称为永久区域)用于存储不会经常变化的数据,例如程序的指令代码(C/C++里就是各个函数编译后得到的代码)、用户类型(结构体、类)的声明代码、全局变量、静态变量PS:有些例子提到用静态变量来做递归的计数器,那只是为了说明静态变量的特性。实际上不推荐这种用法,因为这样会对程序性能造成轻微的影响。静态区域内的数据会在程序加载时进行初始化,生存期为程序运行的全部时间。另外,纠正LZ的一个误解:任何变量都只进行一次初始化。局部变量在程序块结束时生存期就结束了,下次再调用这个程序块时从原理上说声明的是另一个变量了(分配到的地址也不一定一样)。PS:在不同编译器的不同编译情况时,实际的内存分区可能不同。例如TC的Small模式下堆和栈区是重合的,而Tiny模式下连静态区域和动态区域都是重合的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式