黑马程序员技术交流社区

标题: c语言中static关键字修饰局部变量起到什么作用 [打印本页]

作者: LKWinIos    时间: 2014-11-29 17:22
标题: c语言中static关键字修饰局部变量起到什么作用
如下一段代码:
  1. void f()
  2.         {
  3.                 static int x=0;
  4.                 int y=0;
  5.                 x++;
  6.                 y++;
  7.                 printf("%d %d\n", x, y);
  8.         }
  9. void main()
  10.         {
  11.                 f();
  12.                 f();
  13.                 f();
  14.         }
复制代码
运行后,输出的结果为:
1  1
2  1
3  1
问题:
1、f()函数中x的变量是不是在第一次调用f()函数只被定义一次,再次调用f()函数时,不再被定义?
2、static修饰main函数的中变量时,是不是多余的,还是有其它用途?



作者: 从今以后    时间: 2014-11-29 17:54
1.只被初始化一次,生命周期一直到程序结束,作用域不变
2.不了解
作者: 我说你是个逗比    时间: 2014-11-29 22:18
2.也不能说在mian函数中定义是多余的,如果你想在其他的函数里面多次用到这个变量,就可以定义这样的静态变量,这样就可以避免重复定义了,坏处是这样的变量不能随代码块及时回收.
作者: 从头再来01    时间: 2014-11-29 22:33
static修饰局部变量的时候,会改变该局部变量在内存中得位置,未用static修饰时,局部变量存储再栈里,当函数运行一次后,会被回收,所以下次再运行该函数的时候,局部变量还是初始值。

当用static修饰局部变量后,该局部变量存放再了数据区,延迟了生命周期,直至程序结束,所以调用一次后该局部变量的值就改变了,下次调用的时候初始值就是改变后的值了
作者: LKWinIos    时间: 2014-11-29 23:09
我说你是个逗比 发表于 2014-11-29 22:18
2.也不能说在mian函数中定义是多余的,如果你想在其他的函数里面多次用到这个变量,就可以定义这样的静态变量 ...

谢谢指教!
作者: LKWinIos    时间: 2014-11-29 23:10
从头再来01 发表于 2014-11-29 22:33
static修饰局部变量的时候,会改变该局部变量在内存中得位置,未用static修饰时,局部变量存储再栈里,当函 ...

谢谢指教,说的很详细。
作者: arui12580    时间: 2014-11-30 00:53
调用f(),要给函数分配内存空间(等于给函数一套楼),函数分配的空间里,得给变量分配空间(等于楼里面搞点房间给变量住)。函数调用完,内存空间就销毁了(等于楼房倒了,小房间也就没了,住在里面的变量也就挂了)但是x变量用了static修饰(等于给它一个nb点的房间,就算房子倒了,它的房间还在,所以它照样活着),但是也不是弄不死它,直到整个程序运行结束,它就会挂掉。
作者: LKWinIos    时间: 2014-11-30 11:52
arui12580 发表于 2014-11-30 00:53
调用f(),要给函数分配内存空间(等于给函数一套楼),函数分配的空间里,得给变量分配空间(等于楼里面搞点房 ...

比喻的很到位




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2