【问题标题】:can we declare the same local static variable in different functions in C?我们可以在 C 的不同函数中声明相同的局部静态变量吗?
【发布时间】:2013-06-04 08:39:56
【问题描述】:

我们可以在 C 的不同函数中声明相同的局部静态变量吗?

例如:

in function1:
void function1()
{
   static int a;
   a++;
   //dosomething here
}

in function2:
void function2()
{
   static int a;
   a++;
   //dosomething here
}

in function3:
void function3()
{
   static int a;
   a++;
   //dosomething here
}

在这种情况下,如果我调用function1 3次,那么我调用function3一次,那么function3中a的值应该是4还是1?

【问题讨论】:

  • 自己尝试有多难?另外,你应该初始化a
  • 我可以自己尝试,但我更喜欢了解原因并被某人欺骗
  • 静态变量会自动初始化为0?

标签: c function static


【解决方案1】:

这是三个不同的变量。他们只是碰巧有相同的名字。改变一个的值不会改变另一个的值。

一个变量有一个关联的范围,在这个范围内它是可见的。来自 C99 标准的 6.2.1 标识符范围部分:

一个标识符可以表示一个对象;一个函数;结构、联合或枚举的标签或成员;类型定义名称;标签名称;宏名;或宏参数。 同一个标识符可以在程序的不同点表示不同的实体。枚举的成员称为枚举常量。宏名和宏参数在此不再赘述,因为在程序翻译的语义阶段之前,源文件中出现的任何宏名都会被构成宏定义的预处理标记序列替换。

和:

对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本区域内可见(即可以使用)。由同一标识符指定的不同实体要么具有不同的范围,或者在不同的名称空间中。 有四种作用域:函数、文件、块和函数原型。(函数原型是声明其参数类型的函数的声明。)

和:

每个其他标识符的范围由其声明的位置确定(在声明符或类型说明符中)。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,标识符具有文件范围,在翻译单元的末尾终止。如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表内,则标识符具有块作用域,该作用域在相关块的末尾终止。如果声明标识符的声明符或类型说明符出现在函数原型(不是函数定义的一部分)的参数声明列表中,则标识符具有函数原型范围,该范围终止于函数声明符的末尾。如果标识符在同一个名称空间中指定两个不同的实体,则范围可能会重叠。如果是这样,一个实体的范围(内部范围)将是另一个实体范围(外部范围)的严格子集。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内是隐藏的(不可见)。

发布代码中的每个a(标识符)都有函数范围,因此不会干扰在另一个函数中声明的a

静态变量会自动初始化为0?

static 指定a 的生命周期,即静态存储持续时间。来自6.2.4 对象的存储持续时间部分

使用外部或内部链接或存储类说明符 static 声明其标识符的对象具有静态存储持续时间。对于这样的对象,存储空间是保留的,并且其存储值仅在程序启动之前初始化一次。 该对象存在,具有恒定地址,并在整个程序的执行过程中保留其最后存储的值。 23)

以及来自6.7.8 初始化节:

如果具有静态存储持续时间的对象未显式初始化,则:

--如果有指针类型,则初始化为空指针;

--如果是算术类型,则初始化为(正或无符号)零;

--如果是聚合,则每个成员都根据这些规则进行初始化(递归);

-- 如果是联合,则根据这些规则(递归)初始化第一个命名成员。

所以a 被初始化为0

【讨论】:

    【解决方案2】:
    1. 局部静态变量的作用域是局部的,所以都是不同的。
    2. 但他们的生命是直到您的程序不终止。
    3. 都有初始值(默认)0
    4. 来自静态段的内存。
    5. 内部静态变量在特定情况下处于活动状态(可见性) 功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2011-05-05
      相关资源
      最近更新 更多