打印

C中static的问题请教!

[复制链接]
2824|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ARM_start|  楼主 | 2007-11-30 16:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看见别人写的一个示例,讲如下的代码是有问题的。

unsigned int sum_int( unsigned int base )
{
 unsigned int index;
 static unsigned int sum = 0; // 注意,是static类型的。 
 for (index = 1; index <= base; index++)
 {
  sum += index;
 }
 return sum;
}


原文讲,sum定义为static是不可以的。
我如果改成这样可不可以:
unsigned int sum_int( unsigned int base )
{
 unsigned int index;
 static unsigned int sum ; // 注意,是static类型的。 
 for (sum=0,index = 1; index <= base; index++)
 {
  sum += index;
 }
 return sum;
}

相关帖子

沙发
yuanjian79| | 2007-11-30 16:23 | 只看该作者

yi yang de.

yi yang de. dou hui baocun shang zui hou yici de jieguo.
shangmian di yi ci jieguo ke zhengque.
ni xiugai hou, di yi ci jieguo keneng bu zhengque.
yao yilai bianyiqi de moren chushihua.

使用特权

评论回复
板凳
ARM_start|  楼主 | 2007-11-30 16:28 | 只看该作者

为什么不能在此用static呢?

冲突是怎么来的?

使用特权

评论回复
地板
ayb_ice| | 2007-11-30 17:22 | 只看该作者

静态变量占用全局变量空间

访问有些限制,其它模块不能访问,如果是局部变量其它模块更不能访问。

使用特权

评论回复
5
Swd21ic| | 2007-11-30 23:37 | 只看该作者

是这样.

我认为你改了之后是可以的.. 

假设一个函数内定义个静态变量,并在它定义时就给了初值,如:

void fun (void)
{
    static s_cnt = 1;
    ...  // 其他代码
}

那么是在编译的时候赋值给这个静态变量,以后每次调用都不会再让他等于1,而是继续上一次的值

但如果在定义时没有给初值(默认是0),但在下一句赋值,如:
void fun (void)
{
    static s_cnt;
    s_cnt = 1;
    ... //其他代码
}

这样每次进来都是s_cnt都是1..






使用特权

评论回复
6
eraychen| | 2007-11-30 23:47 | 只看该作者

干嘛在这里要用static?

使用特权

评论回复
7
ARM_start|  楼主 | 2007-12-1 08:52 | 只看该作者

没有什么目的,只是对这个概念理解不清楚,所以请教的了

个人同意 Swd21ic的说法,但不知道对不对……


再来几个高人讲讲!!!

使用特权

评论回复
8
ARM_start|  楼主 | 2007-12-1 09:04 | 只看该作者

其它模块不需要访问这个变量

就是一个静态局部变量啊,还是重入的问题把?

使用特权

评论回复
9
hkap| | 2007-12-1 10:22 | 只看该作者

静态局部变量改变了其生存期

它和全局变量一样占用一个固定单元,但其它函数不能访问,在该函数内部可以继续使用上次的值(如果不初始化的话)

使用特权

评论回复
10
yewuyi| | 2007-12-1 10:38 | 只看该作者

再次的初始化也是不能执行的~~

使用特权

评论回复
11
坏蛋蚱蜢| | 2007-12-1 21:31 | 只看该作者

lz,俺教你个方法好记

 static 变量是一个只能由一个子程序访问的“全局变量”。其他的就好理解了吧。

使用特权

评论回复
12
hellomcu| | 2007-12-2 00:19 | 只看该作者

语言的static关键字有两层意思

语言的static关键字有两层意思: 
   1、局部的  

局部的意思是:当前用static定义的变量或函数,是局部的,不是全局的,并不是任何函数或任何地方都可以调用它。
  如 static fun();则fun()函数只可以在当前的文件内被调用,相关地方调用是要出错的。
  再如:
unsigned int sum_int( unsigned int base )
{
 unsigned int index;
 static unsigned int sum = 0; //则sum只可以在当前的函数内使用,在其它的地方使用是会出错的。
   .......
 //
 return sum;
}

例:再定义 
void fun1(void)
{
    sum  = 1;   //此时是要出错的。

}
    
    2、静态的

  静态的基本意思是,系统会为它会在当前存贮空间实际分配一块存贮地址。此地址空间会一直存在,直到当前系统消亡,此点特征像全局变量。
   有了一个固定地址,随便你干什么都行。如果你有一个函数访问此地址,那也就只有此函数可以改变此地址的值(也即此变量的值)。


顺便说一下,你举的例子。你的例子下面没有错,如5楼所说。但产生了一个程序优化问题,因static的静态性,它一直占有一个存贮单元,这对系统的资料使用不利。

  希望你看明白了,回头再找书来看看吧,书上都有的,就是extern,static,全局和局部等一些概念的区别。

相关链接:http://shop35088126.taobao.com

使用特权

评论回复
13
hotpower| | 2007-12-2 00:21 | 只看该作者

俺对static关键字的应用就是减少全局变量和变量数据的存储

俺再也找不到应用的第3个理由~~~

使用特权

评论回复
14
mapleyang| | 2007-12-2 19:44 | 只看该作者

re

楼上的,static还可以用在函数上,限制对函数的访问嘛

对于一些需要保留上次执行结果,但又仅限于在一个模块或者函数内使用的变量,就只能用静态变量了。

使用特权

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

本版积分规则

4

主题

31

帖子

0

粉丝