函数中的局部静态变量可以被多次初始化吗

int & A1()

{

static int a = 10;

a++;

return a;

}

int main(int argc, const char * argv[]) {

A1();

A1();

A1();

return 0;

}
如上代码所属,执行完毕后,a的值为13,调用A1()函数是,static int a = 10 不会覆盖a的值吗?

  é™æ€å±€éƒ¨å˜é‡å…·æœ‰å±€éƒ¨ä½œç”¨åŸŸã€‚它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

  å„个变量的比较区别。

    ä»Žä½œç”¨åŸŸçœ‹ï¼š

    å…¨å±€å˜é‡å’Œå±€éƒ¨å˜é‡ï¼šå…¨å±€å˜é‡å’Œå±€éƒ¨å˜é‡çš„区别主要在于身存周期不同,全局变量在整个程序生成期可见,局部变量在自己的作用域可见。全局变量的内存分配是静态的,如果没有赋初值,会被初始化为0。局部变量的内存分配是动态的,位于堆栈中,如果没有初始化,初值视当前内存内的值而定。

    å…¨å±€å˜é‡å…·æœ‰å…¨å±€ä½œç”¨åŸŸã€‚全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

    é™æ€å…¨å±€å˜é‡ä¹Ÿå…·æœ‰å…¨å±€ä½œç”¨åŸŸï¼Œä»–与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。

    å±€éƒ¨å˜é‡ä¹Ÿåªæœ‰å±€éƒ¨ä½œç”¨åŸŸï¼Œä»–是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

    é™æ€å±€éƒ¨å˜é‡å…·æœ‰å±€éƒ¨ä½œç”¨åŸŸã€‚它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

    ä»Žå†…存分配看:

    å…¨å±€å˜é‡ã€é™æ€å±€éƒ¨å˜é‡ã€é™æ€å…¨å±€å˜é‡éƒ½åœ¨é™æ€å­˜å‚¨åŒºåˆ†é…ç©ºé—´ï¼Œè€Œå±€éƒ¨å˜é‡åœ¨æ ˆåˆ†é…ç©ºé—´ã€‚

    å…¨å±€å˜é‡æœ¬èº«å°±æ˜¯é™æ€å­˜å‚¨æ–¹å¼ï¼Œé™æ€å…¨å±€å˜é‡å½“然也是静态存储方式。这两者在存储方式上没有什么不同。区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。

    1、静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是他与堆栈变量和堆变量的区别

    2、变量用static告知编译器,自己仅仅在变量的作用域范围内可见。这一点是他与全局变量的区别。

    ä»Žä»¥ä¸Šåˆ†æžå¯ä»¥çœ‹å‡ºï¼ŒæŠŠå±€éƒ¨å˜é‡æ”¹å˜ä¸ºé™æ€å˜é‡åŽæ˜¯æ”¹å˜äº†ä»–的存储方式,即改变了他的生存期。把全局变量改变为静态变量后是改变了他的作用域,限制了他的使用范围,因此static这个说明符在不同的地方起的作用是不同的。

    ä¸åŒç±»åž‹çš„变量在内存中的位置:

    1、 已经初始化的全局变量存放与data数据段;未初始化的全局变量存放与bss数据段。

    2、 静态的全局变量存放与data数据段

    3、 局部变量存放在栈上。

    4、 静态局部变量,并不是在调用函数时分配函数返回时释放,而是像全局变量一样静态分配,存放data数据段,但它的作用域在函数中起作用。

   

    ä¸‹å›¾æ˜¯å†…存中的简要分布图,可以更直观的理解个类型变量在内存中的存放位置,图1。

温馨提示:答案为网友推荐,仅供参考
相似回答