我在C代码的不同地方看到过静态这个词;这是否像c#中的静态函数/类(实现是跨对象共享的)?


当前回答

静态变量有一个特性,即使在它们超出作用域后也能保存它们的值!因此,静态变量在以前的作用域中保留它们以前的值,而在新的作用域中不再初始化。

看看这个例子 静态int变量在程序运行时保留在内存中。当声明变量的函数调用结束时,普通变量或自动变量将被销毁。

#include<stdio.h> 
int fun() 
{ 
  static int count = 0; 
  count++; 
  return count; 
} 

int main() 
{ 
  printf("%d ", fun()); 
  printf("%d ", fun()); 
  return 0; 
}

这将输出:12

As 1保留在内存中,因为它被声明为静态

静态变量(如全局变量)如果没有显式初始化,则初始化为0。例如,在下面的程序中,x的值被打印为0,而y的值是垃圾。更多细节请参见此。

#include <stdio.h> 
int main() 
{ 
    static int x; 
    int y; 
    printf("%d \n %d", x, y); 
}

这将输出:0 (some_garbage_value)

这些是我发现的主要问题,上面没有为新手解释!

其他回答

C语言中的静态变量具有程序的生命周期。

如果在函数中定义,则它们具有局部作用域,即只能在这些函数中访问它们。静态变量的值在函数调用之间保留。

例如:

void function()
{
    static int var = 1;
    var++;
    printf("%d", var);
}

int main()
{
    function(); // Call 1
    function(); // Call 2
}

在上面的程序中,var存储在数据段中。它的生命周期是整个C程序。

函数调用1后,var变为2。函数调用2后,var变为3。

var的值不会在函数调用之间被销毁。

如果var在非静态变量和局部变量之间,它将被存储在C程序的堆栈段中。由于函数的堆栈帧在函数返回后被销毁,因此var的值也被销毁。

初始化的静态变量存储在C程序的数据段中,而未初始化的静态变量存储在BSS段中。

关于静态的另一个信息:如果一个变量是全局的并且是静态的,那么它具有C程序的生命周期,但是它具有文件作用域。它只在该文件中可见。

试试这个:

file1.c

static int x;

int main()
{
    printf("Accessing in same file%d", x):
}

file2.c

    extern int x;
    func()
    {
        printf("accessing in different file %d",x); // Not allowed, x has the file scope of file1.c
    }

run gcc -c file1.c

gcc -c file2.c

现在试着把它们连接起来:

gcc -o output file1.o file2.o

它会给出一个链接器错误,因为x的文件作用域是file1.c,而链接器将无法解析file2.c中使用的对变量x的引用。

引用:

http://en.wikipedia.org/wiki/Translation_unit_(编程) http://en.wikipedia.org/wiki/Call_stack

一个静态变量值在不同的函数调用之间持续存在,它的作用域被限制在本地块 静态变量的初始值总是0

如果你在mytest.c文件中声明这个:

static int my_variable;

那么这个变量只能从这个文件中看到。该变量不能导出到其他任何地方。

如果在函数内部声明,则每次调用该函数时,变量的值将保持不变。

静态函数不能从文件外部导出。因此,在*.c文件中,如果将函数和变量声明为静态,则隐藏了它们。

我讨厌回答一个老问题,但我认为没有人提到K&R在“C编程语言”的A4.1节中是如何解释它的。

简而言之,“static”一词有两层含义:

静态是两个存储类之一(另一个是 自动)。静态对象在调用之间保持其值。在所有块外声明的对象总是静态的,不能自动的。 但是,当静态关键字(强调它被用于 代码作为关键字)与声明一起使用,它提供了该对象的内部链接,因此它只能在该翻译单元中使用。但是如果在函数中使用关键字,它将改变对象的存储类(无论如何,对象只在该函数中可见)。与static相对的是extern关键字,它提供对象外部链接。

Peter Van Der Linden在“Expert C Programming”中给出了两个含义:

在函数内部,在调用之间保留其值。 在函数级,仅在此文件中可见。

静态变量是可以在函数中使用的特殊变量,它在调用之间保存数据,并且不会在调用之间删除数据。例如:

void func(void) {
    static int count; // If you don't declare its value, it is initialized with zero
    printf("%d, ", count);
    ++count;
}

int main(void) {
    while(true) {
        func();
    }
    return 0;
}

输出:

0, 1, 2, 3, 4, 5...