声明全局变量和静态变量

时间:2013-09-17 04:40:06

标签: c static-variables

我正在研究静态变量,我在维基百科上看到了这段代码。 static int x在整个程序中存储它的值。即使我们在全球范围内声明它,它也会存储以前的值。这是否意味着静态和全局变量被视为相同。如果不是,两者如何工作?

#include <stdio.h>

 void func() {
       static int x=0;
        // x is initialized only once across three calls of func()
        printf("%d\n", x); // outputs the value of x
        x = x + 1;
}

 int main(int argc, char *argv[]) {
        func(); // prints 0
        func(); // prints 1
        func(); // prints 2
        return 0;
}

7 个答案:

答案 0 :(得分:8)

说明符static的含义略有不同,具体取决于您使用它的位置。您有3个选项来声明一个变量,该变量的值在程序的整个生命周期中都要保留:

1)在函数(即局部变量)中将变量声明为static时,意味着在整个程序生命周期内,函数调用之间将保留其值。如果将变量初始化为某个值,则这是第一个函数调用时该变量的起始值;所有后续函数调用都将保留变量的值,而不是重新初始化。

2)当声明一个全局变量(没有static说明符)时,它的值在程序的整个生命周期中都被保留,就像它是一个局部静态变量一样,但区别在于全局变量是可见的(通过程序的任何文件的任何功能读取和写入)。

3)当声明全局static变量时,它的值在程序的整个生命周期中再次保留,但与普通全局变量相反,它只能由同一文件中的其他函数访问。 / p>

总之,所有这三种变量都保留了它们的价值;区别在于它们的范围,这意味着哪些函数可以访问此变量。

以下代码的所有3个变量在整个程序的生命周期内保留其值。

int x = 100;         // visible to any function within any .c file of this program
static int y = 5000;  // visible from any function within this .c
int func (int i)
{
  static int z = 0;      // invisible to all other functions
  x += i;
  y += i;
  z += i;
  return z;
}

可以找到详尽的解释here

答案 1 :(得分:2)

函数中的static变量与全局变量之间存在相似之处。两者的生命周期与整个程序的生命周期相同。这意味着在对函数的调用之间保留对函数中的静态变量所做的任何更改。

但是,最重要的区别是函数中的静态变量只能通过该函数中的名称访问。如果函数使指针可用于其他代码,则可以通过指针访问它。但除此之外,它隐藏在函数内部,其他函数可以有一个具有相同名称的静态变量,并且可能有一个同名的文件范围变量(这将隐藏在函数内)。

相比之下,全局变量可以在声明的任何地方按名称访问 - 可能在多个源文件中。

答案 2 :(得分:1)

修改了代码以包含全局变量和静态变量。

#include <stdio.h>

 int z;              // can be accessed by other modules
 static int y;       // can only be used by this source module

 void func() {
       static int x=0;
        // x is initialized only once across three calls of func()
        printf("%d %d\n", x); // outputs the value of x
        x++;
        y++;
}

 int main(int argc, char *argv[]) {
        y = 3;
        func(); // prints: 0 3
        func(); // prints: 1 4
        func(); // prints: 2 5
        return 0;
}

y仍然存在,可以从mainfunc访问。 x仍然存在,但只能从func中读取。如果z声明:extern int z;,则可以从其他源模块中的其他代码中读取{{1}}。

答案 3 :(得分:0)

是的,它们都差不多。函数内声明为static的变量只能由该函数引用/使用。

这有利于限制只有特定函数使用的变量的范围。制作仅由一个函数使用的全局变量没有意义。它会使你的程序不那么清晰。

答案 4 :(得分:0)

是的,静态变量就像全局变量一样存储。它的价值将在整个计划的整个生命周期中持续存在。

static关键字如果在函数外声明,也会影响变量的范围。无法通过其他源文件中的名称访问该变量。

答案 5 :(得分:0)

Global vs local更多是关于可访问性的。静态vs实例变量是不同的,因为它处理数据的存储方式,静态数据存储在类型级别,这意味着它在特定类型的所有变量之间共享。另一方面,实例变量与特定实例相关联,并且对实例是唯一的。

答案 6 :(得分:0)

这是变量范围和生命周期的经典问题。

变量的范围是可以引用或可访问该变量的范围。范围可以在特定功能或整个文件或整个程序中。

另一方面,变量的生命周期是变量在内存中保留其空间的时间。生命周期可以限于函数调用或程序的整个执行。

基于这些因素,变量的位置也会发生变化。例如,局部变量占用堆栈上的空间。但是,如果此局部变量具有静态的说明符,则此变量占用数据部分中的空间,但是链接(或可见性)仅在声明它的函数内。因此,当函数调用完成时,它不会丢失其当前值,但只能在函数内访问。

另一方面,全局变量具有定义它的整个文件的范围,并占据数据部分中的空间。

因此,如上所述,静态变量和全局变量都占据数据部分的空间,但它们与程序的链接是不同的,即功能和整个文件。希望有所帮助!

这个问题的最佳参考是“C程序设计语言”。