在C的主函数中使用静态变量有意义吗?

在C的主函数中使用静态变量有意义吗?,c,function,static,main,C,Function,Static,Main,就我目前对“static”关键字的理解而言,它可以防止变量被重新初始化,并且可以防止变量在函数结束时离开内存 在C语言中,当变量不需要是全局变量,但也不应该在函数调用之间更改时,我通常使用这种方法。(f.i.微控制器中断) 现在,在STM32的一些C代码中,我看到了以下内容: int main(void) { static char buffer[CONSOLEBUFFERSIZE]; ... 对我来说,这毫无意义。此变量用于缓冲传入命令,以便在接收到终止字符时对其进行处理。但是我前面

就我目前对“static”关键字的理解而言,它可以防止变量被重新初始化,并且可以防止变量在函数结束时离开内存

在C语言中,当变量不需要是全局变量,但也不应该在函数调用之间更改时,我通常使用这种方法。(f.i.微控制器中断)

现在,在STM32的一些C代码中,我看到了以下内容:

int main(void)
{
  static char buffer[CONSOLEBUFFERSIZE];
  ...
对我来说,这毫无意义。此变量用于缓冲传入命令,以便在接收到终止字符时对其进行处理。但是我前面描述的“static”的两个属性不适用于main函数,因为main()只被调用一次,并且“永不”结束。所以我的实际问题是:


这可能是使用了一些我不知道的hocus pocus,或者只是从中断或其他函数中复制代码,程序员是否忘记或不费心删除static关键字?

一个区别是,静态变量通常使用程序的数据段而不是堆栈。也许这就是将缓冲区声明为静态缓冲区的原因(特别是如果控制台缓冲区很大的话)。

我认为当你制作一个包含许多文件和主文件的c项目时,它的值不会改变……

在一些系统上,堆栈是固定的,有限的大小。在这些情况下,
static
很有用,只需将缓冲区移出堆栈,并将其放置在链接器已设置为分配更多空间的位置


也可以重新配置链接器以提供更大的初始堆栈,但是
static
更容易,而且仍然做正确的事情。

如果CONSOLEBUFFERSIZE非常大,堆栈可能会溢出,因此使用static是安全的。C编译器没有义务将
main()
的变量放在“堆栈”空间中。因此,使用
static
将变量从“堆栈”移动到“数据”段取决于编译器的实现<代码>静态可能会根据一些答案的建议更改段。它也可能没有效果。这实际上是完全有道理的。我不知道这个系统的堆栈边界是什么,但是堆栈上64字节的永久分配听起来像是你想要避免的事情。它确实有助于防止堆栈溢出。(64是CONSOLEBUFFERSIZE的当前值)也就是说,如果它是一个全局变量,那么您可以在其他文件中自由地将其外部化并使用它。。。