C 静态变量

C 静态变量,c,C,有人能解释一下什么时候应该使用静态变量以及为什么吗?在C中,static实际上意味着两件不同的事情: 1) 在函数内部,这意味着函数退出后,静态变量将保持存在 2) 否则,这意味着静态变量或函数是该编译单元(“文件”)的本地变量或函数,即外部不可见 在C中,在函数外部声明为静态的变量将无法从该文件外部访问(不能在另一个文件中使用extern..) 对于函数中的局部变量,static将使变量的生存期持续到程序的整个执行过程,而不仅仅是在堆栈上分配的变量 当使用静态变量时,它确实会引起多线程问题,因

有人能解释一下什么时候应该使用静态变量以及为什么吗?

在C
中,static
实际上意味着两件不同的事情:

1) 在函数内部,这意味着函数退出后,
静态
变量将保持存在

2) 否则,这意味着
静态变量或函数是该编译单元(“文件”)的本地变量或函数,即外部不可见

在C中,在函数外部声明为静态的变量将无法从该文件外部访问(不能在另一个文件中使用extern..)

对于函数中的局部变量,static将使变量的生存期持续到程序的整个执行过程,而不仅仅是在堆栈上分配的变量


当使用静态变量时,它确实会引起多线程问题,因为该变量只存在一个实例-因此需要记住。

在C中有两种不同的使用
static
关键字:

  • 函数作用域中的静态声明
  • 函数范围外的静态声明

(主要是)邪恶:函数中的静态变量 函数中的静态变量用作“内存”状态

基本上,您的变量仅在第一次调用时初始化为默认值,然后在以后的所有调用中保留其以前的值

如果您需要记住这样的状态,它可能很有用,但通常不赞成使用这样的静态变量,因为它们几乎是伪装的全局变量:它们将消耗您的内存,直到进程终止一次

因此,一般来说,生成本地化函数是有害的

示例:

#include <stdio.h>


void  ping() {
  static int counter = 0;

  return (++counter);
}

int   main(int ac, char **av) {
  print("%d\n", ping()); // outputs 1
  print("%d\n", ping()); // outputs 2
  return (0);
}
1
2
file1.c: test()
file2.c: test()

(大部分)好:函数范围外的静态变量 您可以在变量或函数上使用函数外部的static(毕竟,它也是一种变量,指向内存地址)

它所做的是将该变量的使用限制在包含它的文件中。你不能从别的地方叫它。虽然它仍然意味着该函数/var是“全局的”,在程序终止之前它会消耗您的内存,但至少它不污染您的“名称空间”

这很有趣,因为这样您可以在项目的不同文件中使用名称相同的小实用程序函数

因此,一般来说,制作本地化函数是好的

示例:

#include <stdio.h>


void  ping() {
  static int counter = 0;

  return (++counter);
}

int   main(int ac, char **av) {
  print("%d\n", ping()); // outputs 1
  print("%d\n", ping()); // outputs 2
  return (0);
}
1
2
file1.c: test()
file2.c: test()
例h

文件1.c

PS:如果你是一个纯粹主义者,请不要向我扔石头:我知道静态变量并不邪恶,它们也不完全是全局变量,函数也不完全是变量,C中没有实际的“名称空间”(不要从符号开始)。但这是为了这里的解释

资源

    • 取决于您所谈论的范围

      在函数内部、类定义内部还是在全局变量前面是静态的

      在函数中,当需要防止重新初始化变量时,这是很好的。以下次数将为10次

        for(int z=0; z<10; z++)
        {
          static int number_of_times = 0;
          number_of_times++;
        }
      

      for(int z=0;zRarely,如果有的话)。在大多数情况下,不是外部系统编程。为什么要投反对票?这听起来像是一个学术问题,但如果这实际上是作业的一部分,那就是一个差劲的作业。但另一方面,在我看来,这是一个很好的一般性问题,值得回答。(如果不是重复的话)事实上,它们比你说的更像全局变量。静态局部变量通常存储在.bss或.data中,并在加载时或编译时初始化。@Nathon:嘿,我甚至不知道。太好了,谢谢!@Nathon:我在问你,但其他人都很好,而且我手边没有带C编译器的机器……如果你使函数声明在c函数中是静态的(因为您可以在c中声明嵌套函数,即使据我所知,它没有任何实际的用例)?考虑一下,然后想知道这是否可能,以及它是否有任何作用(无论如何可能不在标准中)你对静态函数变量为什么不好的推理是有缺陷的。如果你把它们看成是伪装的全局变量,那么你就封装了变量,封装通常是一件好事。但是主要的问题是封装被限制在一个函数上(但这只是语言)。。我认为避免使用静态函数变量以及全局变量的最好理由是它们不是线程安全的或可重入安全的。@haylem:“错误:函数的存储类无效”我今天学到了一些东西!向下投票解释?当然这并不像公认的答案那样冗长,但要点是相同的。