10

在 C 中,当外部变量可以以相同的成本达到其目的时,静态存储类的用途是什么,即。两者都占用可执行文件数据段中的存储空间。

我对外部变量有更好的范围。如果我希望外部变量的范围是特定文件,我不会在其他地方声明这个变量。我看到全局变量比静态局部变量有很大的灵活性

如果我们有变量的地址,我们可以在函数外部引用局部静态变量。局部静态变量的内存将在数据段中,而不是在函数的堆栈帧中。所以静态存储类带来了独特的功能.

我只想知道静态是否有任何我不知道的微妙目的。

4

6 回答 6

29

你写了一个全局变量有一个“更好”的范围。这是不正确的。它的范围更大。越大越好。

如果您需要标识符在更多地方可见,则可能需要更大,但通常情况并非如此。但是更大的范围意味着更多的错误风险。全局变量混淆了例程的语义,使查看它们使用和更改的程序状态变得更加困难,并且增加了由于未能声明局部标识符和其他错误而导致错误的可能性。

特别是,具有外部链接的标识符将与其他库中的标识符发生冲突。考虑一下当您编写一个物理应用程序时会发生什么,有一个名为 的外部标识符acceleration,并与一个也有一个名为 的外部标识符的物理库链接acceleration。该程序将失败。因此,外部标识符通常是糟糕的设计。

我们开发和维护复杂软件的能力的一个重大限制是人为错误。许多编程语言语义限制了语言以防止错误。使用原始计算机,您可以添加两个指针,丢弃堆栈指针,意外地将 a 的字节加载float到整数寄存器中,等等。好的编程语言使这些错误很难被错误地处理。

在范围规则帮助控制它们之前,全局变量是错误的更大来源。优秀的程序员会限制其标识符的范围。

于 2013-04-04T10:38:29.247 回答
7

全局变量很好,是全局的,它可以从任何地方访问。

静态局部变量具有局部作用域。它是静态的,因此它的生命周期贯穿应用程序的生命周期,但是它只能从本地范围访问(无论该范围是函数、块还是文件)

于 2013-04-04T10:04:38.670 回答
1

基本区别在于变量的范围。

1)全局变量对整个项目都是全局的。假设您的项目有 10 个不同的文件,那么所有 10 个文件都可以访问全局变量(请参阅如何使用 extern)。

2) 静态变量/函数可由定义它的函数/文件使用。它不能被项目中的任何其他文件使用。

但是,您可以通过传递变量的引用来修改 func2() 中的静态变量(在 func1() 中定义)。请看下面的例子,

void func2(int *i)
{
    (*i)++;
}

void func1()
{
    static int i;

    i=1;
    printf("%d\n", i);
    func2(&i);
    printf("%d\n", i);  
}

int main()
{
    func1();
    return 0;
}

正如你在上面看到的,func1()static int i不能直接被 func2() 操作,但是如果你传递变量的引用,你仍然可以像普通变量一样操作变量。

希望能帮助到你...

于 2013-04-04T10:08:34.527 回答
0

本地全局之间的区别首先是范围:您只能从定义它们的块内访问局部变量,而可以从任何地方访问全局变量。因此,在全局范围内只能有一个具有给定名称的变量,但在不同的函数中可以有多个局部静态变量。

与静态全局变量与外部变量相比:是的,静态全局变量是翻译单元的本地变量(即定义它们的 .c 源文件)。

所以这里主要关注的是范围的概念,存储自然来自那里。

于 2013-04-04T10:05:00.387 回答
0

您应该使用局部静态变量的原因是作用域,因此避免了一些容易出现错误的情况,因为使用局部静态变量您将无法在定义它的函数之外引用它。

于 2013-04-04T10:05:13.160 回答
-1

这是一个演示差异的简短程序:

#include <stdio.h>

static int a=20;
void local()
{
   printf("%d,addr:%d \n", a, (void*)&a);
   a = 100;
}

int main()
{

      {
         static int a = 10;
         printf("%d,addr:%d \n", a, (void*)&a);
         local();
      }
      printf("%d addr:%d \n", a, (void*)&a);
}

输出:

10,addr:134518604   -- local static inside the braces
20,addr:134518600   -- this is referring the global static variable
100 addr:134518600  -- This is referring the global static variable which is outside of 
                       the braces.

这里大括号也很重要:如果main()函数中没有大括号,那么它只引用局部静态变量。

于 2018-06-19T14:14:16.533 回答