A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如下一段代码:
  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函数的中变量时,是不是多余的,还是有其它用途?


评分

参与人数 1黑马币 +1 收起 理由
星河鹭起 + 1

查看全部评分

7 个回复

正序浏览
arui12580 发表于 2014-11-30 00:53
调用f(),要给函数分配内存空间(等于给函数一套楼),函数分配的空间里,得给变量分配空间(等于楼里面搞点房 ...

比喻的很到位
回复 使用道具 举报
arui12580 来自手机 中级黑马 2014-11-30 00:53:10
7#
调用f(),要给函数分配内存空间(等于给函数一套楼),函数分配的空间里,得给变量分配空间(等于楼里面搞点房间给变量住)。函数调用完,内存空间就销毁了(等于楼房倒了,小房间也就没了,住在里面的变量也就挂了)但是x变量用了static修饰(等于给它一个nb点的房间,就算房子倒了,它的房间还在,所以它照样活着),但是也不是弄不死它,直到整个程序运行结束,它就会挂掉。
回复 使用道具 举报
从头再来01 发表于 2014-11-29 22:33
static修饰局部变量的时候,会改变该局部变量在内存中得位置,未用static修饰时,局部变量存储再栈里,当函 ...

谢谢指教,说的很详细。
回复 使用道具 举报
我说你是个逗比 发表于 2014-11-29 22:18
2.也不能说在mian函数中定义是多余的,如果你想在其他的函数里面多次用到这个变量,就可以定义这样的静态变量 ...

谢谢指教!
回复 使用道具 举报
static修饰局部变量的时候,会改变该局部变量在内存中得位置,未用static修饰时,局部变量存储再栈里,当函数运行一次后,会被回收,所以下次再运行该函数的时候,局部变量还是初始值。

当用static修饰局部变量后,该局部变量存放再了数据区,延迟了生命周期,直至程序结束,所以调用一次后该局部变量的值就改变了,下次调用的时候初始值就是改变后的值了
回复 使用道具 举报
2.也不能说在mian函数中定义是多余的,如果你想在其他的函数里面多次用到这个变量,就可以定义这样的静态变量,这样就可以避免重复定义了,坏处是这样的变量不能随代码块及时回收.
回复 使用道具 举报
1.只被初始化一次,生命周期一直到程序结束,作用域不变
2.不了解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马