打印

问个C语言问题

[复制链接]
2628|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sysdriver|  楼主 | 2011-3-25 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近系统复习了一下C语言,看到全局变量和局部变量、动态变量和静态变量时,有个问题。

int v1= 5;
int   add(int date)
{
       static  int  v1 =2;
       int  k;
       k = v1 + date;
       v1++;
       return k;
}
void    main()
{
      int a,b;
      while(1)
     {
            a = add(5);
            v1++;
            b = add(5);
            a +=b;
            a = add(b);
     }
}
在局部域中,同名的全局变量被屏蔽。不在局部域,同名的局部变量就被屏蔽。
有点矛盾的是,局部静态变量不也是局部吗,局部的话,函数返回不就释放内存吗?
我个人的感觉就是,static好像没有什么优势,而且还占着内存不放,还不如直接用全局变量。

相关帖子

沙发
HWM| | 2011-3-25 23:06 | 只看该作者
re L:

“局部静态变量”内存分配上和全局变量无异,但其只能在定义域内使用。如果想退出模块后还保留一些数据或状态的话,局部静态变量还是有点用处地。

使用特权

评论回复
板凳
tcp1985| | 2011-3-25 23:14 | 只看该作者
局部静态变量在编译的时候就分配好内存的了,无论程序运行到神马地方都不会释放内存的。
当在某个子函数中需要长期使用某个变量时,你将它定义为static的话看起来变量定义很条理性。
我写程序的习惯:能用局部的就用局部的,不能用局部的就用局部静态,不能用局部静态就用全局的。

使用特权

评论回复
地板
ayb_ice| | 2011-3-26 08:27 | 只看该作者
局部static变量比较特殊,其实占用全局空间,访问是局部特性

使用特权

评论回复
5
sysdriver|  楼主 | 2011-3-26 11:08 | 只看该作者
多谢大家的回答,现在是理解了static的本质。
但是,我怎么感觉static好像是一种缺陷呢。因为在内存管理上是不方便的,而有些static变量就用一会
后就不管了,那么不是造成碎片了?如果是全局变量,或许有方法利用回来。所以我觉得,能不用static就
不用,能不写出static的函数就不要写,能往局部动态方向思考就很好。

使用特权

评论回复
6
ayb_ice| | 2011-3-26 11:22 | 只看该作者
多谢大家的回答,现在是理解了static的本质。
但是,我怎么感觉static好像是一种缺陷呢。因为在内存管理上是不方便的,而有些static变量就用一会
后就不管了,那么不是造成碎片了?如果是全局变量,或许有方法利用回 ...
sysdriver 发表于 2011-3-26 11:08

无语,
你应该没有什么项目经验

使用特权

评论回复
7
陈永宾0| | 2011-3-26 12:35 | 只看该作者
呵呵  路过 瞅瞅

使用特权

评论回复
8
sysdriver|  楼主 | 2011-3-26 13:15 | 只看该作者
7# ayb_ice

C语言的项目经验是少点,或许是我太追求完美吧

使用特权

评论回复
9
areshan| | 2011-3-26 13:24 | 只看该作者
tcp1985:
我写程序的习惯:能用局部的就用局部的,不能用局部的就用局部静态,不能用局部静态就用全局的。
是很好的习惯,谢谢你,学习了!!!!!!

使用特权

评论回复
10
areshan| | 2011-3-26 13:26 | 只看该作者
全局变量用来传递数据,个人觉得真的不好用!如果函数里有全局变量,那函数就不能通用了。

使用特权

评论回复
11
bh7kve| | 2011-3-27 00:22 | 只看该作者
tcp1985:
我写程序的习惯:能用局部的就用局部的,不能用局部的就用局部静态,不能用局部静态就用全局的。

!!!!

使用特权

评论回复
12
781260354| | 2011-3-27 19:25 | 只看该作者
:dizzy:路过  不太懂

使用特权

评论回复
13
Metalor| | 2011-3-28 09:58 | 只看该作者
当函数执行完毕又希望保存函数执行时得到的数据时,就必须用全局变量或者局部static变量。因为局部变量存在堆栈里,函数执行完毕即被释放,等到需要他的时候他已不存在了。6L说的用一会就不用了,成碎片了,那也没办法,既然要用一会,又不能用局部变量来实现,那就必须得用static,有点被逼的意思,因为实在没办法。

某些变量只要求在某一个(仅一个)函数里进行访问,而不允许其它函数里访问,static的优势就显现出来了,因为其他函数无法访问,可以防止误操作等,而全局变量就到不到这样的效果。并且,对于程序的阅读者来说,static相对于全局变量而言更加一目了然。

使用特权

评论回复
14
sysdriver|  楼主 | 2011-3-28 13:09 | 只看该作者
14# Metalor

说得很在理,副作用是占内存不放,优势是单独函数调用防误操作,方便理解.
是我钻牛角尖了,我想,使用局部静态变量的场合也应该不多.

使用特权

评论回复
15
SHUJIEWS| | 2011-3-28 13:17 | 只看该作者
给你提一个问题,你就知道好处了,如果几个人写程序
大家就有可能变量名写成一样,你用全局变量到时大家重名了还不是要改

使用特权

评论回复
16
sysdriver|  楼主 | 2011-3-28 22:45 | 只看该作者
17# SHUJIEWS

呃,你的意思是,全都用局部静态:o ,不可能吧。取名是有规范的,特别是团队开发程序,这个项目负责人都会讲到的。

最近看人家写的51 RTOS,有些函数都用static,是为了避免KEIL的覆盖分析。本来就少RAM了,还要分配占内存的变量,觉得这个不太好。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

688

帖子

0

粉丝